Skip to content

Commit 5424d5f

Browse files
author
liufeng27
committed
fix memleak
1 parent 8db5b32 commit 5424d5f

File tree

5 files changed

+47
-3
lines changed

5 files changed

+47
-3
lines changed

examples/load_model/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ project(example)
44
find_library(TENSORFLOW_LIB tensorflow HINT $ENV{HOME}/libtensorflow2/lib)
55

66
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
8+
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -lasan")
79

810
add_executable(example main.cpp)
911
target_include_directories(example PRIVATE ../../include $ENV{HOME}/libtensorflow2/include)
10-
target_link_libraries (example "${TENSORFLOW_LIB}")
12+
target_link_libraries (example "${TENSORFLOW_LIB}")

examples/load_model/main.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,10 @@ int main() {
1212

1313
std::cout << output << std::endl;
1414

15+
auto values = output.get_data<float>();
16+
17+
for (auto v : values) {
18+
std::cout << v << std::endl;
19+
}
1520
return 0;
1621
}

include/cppflow/defer.h

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
#include <functional>
3+
4+
namespace cppflow {
5+
6+
class defer {
7+
public:
8+
typedef std::function<void ()> Func;
9+
10+
explicit defer(const Func& func) : _func(func) {}
11+
~defer() {
12+
_func();
13+
}
14+
15+
defer(const defer&) = delete;
16+
defer(defer&&) = delete;
17+
defer& operator=(const defer&) = delete;
18+
void* operator new (size_t) = delete;
19+
void operator delete (void*) = delete;
20+
21+
private:
22+
Func _func;
23+
};
24+
25+
} // namespace cppflow

include/cppflow/model.h

+7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <vector>
1313

1414
#include "context.h"
15+
#include "defer.h"
1516
#include "tensor.h"
1617

1718
namespace cppflow {
@@ -84,6 +85,12 @@ namespace cppflow {
8485

8586
std::vector<TF_Output> inp_ops(inputs.size());
8687
std::vector<TF_Tensor*> inp_val(inputs.size());
88+
89+
defer d([&inp_val]{
90+
for (auto* tf_tensor : inp_val) {
91+
TF_DeleteTensor(tf_tensor);
92+
}
93+
});
8794
for (int i=0; i<inputs.size(); i++) {
8895

8996
// Operations

include/cppflow/tensor.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,16 @@ namespace cppflow {
167167

168168
// EXECUTE
169169
int n = 1;
170-
TFE_TensorHandle* res[1];
170+
TFE_TensorHandle* res[1] = { nullptr };
171171
TFE_Execute(op, res, &n, context::get_status());
172172
status_check(context::get_status());
173173
TFE_DeleteOp(op);
174174

175175
tensor r;
176176
r.tf_tensor = { TFE_TensorHandleResolve(res[0], context::get_status()), TF_DeleteTensor};
177177
status_check(context::get_status());
178+
TFE_DeleteTensorHandle(res[0]);
179+
178180
r.tfe_handle = {TFE_NewTensorHandle(r.tf_tensor.get(), context::get_status()), TFE_DeleteTensorHandle};
179181
status_check(context::get_status());
180182

@@ -205,7 +207,10 @@ namespace cppflow {
205207

206208
// Convert to correct type
207209
const auto T_data = static_cast<T*>(raw_data);
208-
return std::vector<T>(T_data, T_data + size);
210+
std::vector<T> r(T_data, T_data + size);
211+
TF_DeleteTensor(res_tensor);
212+
213+
return r;
209214
}
210215

211216
datatype tensor::dtype() const {

0 commit comments

Comments
 (0)