File tree Expand file tree Collapse file tree 5 files changed +47
-3
lines changed
Expand file tree Collapse file tree 5 files changed +47
-3
lines changed Original file line number Diff line number Diff line change @@ -4,7 +4,9 @@ project(example)
44find_library (TENSORFLOW_LIB tensorflow HINT $ENV{HOME} /libtensorflow2/lib)
55
66set (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
810add_executable (example main.cpp)
911target_include_directories (example PRIVATE ../../include $ENV{HOME} /libtensorflow2/include )
10- target_link_libraries (example "${TENSORFLOW_LIB} " )
12+ target_link_libraries (example "${TENSORFLOW_LIB} " )
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 1212#include < vector>
1313
1414#include " context.h"
15+ #include " defer.h"
1516#include " tensor.h"
1617
1718namespace 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
Original file line number Diff line number Diff 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 {
You can’t perform that action at this time.
0 commit comments