DataFlow中的内存一般需要区分两个概念:
emptyMsg上是没有MbufData的,c++获得的就是一个nullptr
在使用过程中,FlowMsg的使用与释放取决于该FlowMsg的作用域,作用域的概念包含在FlowGraph和UDF上。
FlowMsg被释放需要满足两个条件:
FlowMsg的释放过程中需要注意:
指针未被释放导致的内存泄露
在Proc执行结束时,如果不将A置位nullptr,则其持有的智能指针则不会释放,会长期持有,产生内存泄漏。
1 2 3 4 5 6 7 8 9 | class A { int32_t Proc(...) { A = xxx; B = func(A); // A = nullptr; } private: std::shared_ptr<FlowFunc::FlowMsg> A; } |
指针离开作用域,而内容继续被使用
在Proc执行结束时,cv::Mat A的数据来自于inputA的mbufData。当func执行结束时,inputA已被释放。此时inputA对应的mbufData可被别的FlowMsg使用。即cv::Mat A由于仅是指针,已失去可信度。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class A { int32_t Proc(...) { A = func(xxx); B = funcA(A); } cv::Mat func(...) { inputA = FlowFunc::FlowMsg xxx; A = get_tensor(inputA); return A; } private: cv::Mat A; } |