内存使用

内存概念

图1 内存示意图

DataFlow中的内存一般需要区分两个概念:

mbuf内存使用注意事项

在使用过程中,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;
}