c++ - Mex 类内存泄漏 - STL 映射是否需要析构函数?

标签 c++ matlab memory-leaks destructor mex

我正在寻找某些 mex 代码中的内存泄漏(我工作的 IT 支持部门没有安装有用的调试标志,这使得 Valgrind 几乎毫无用处...)。

我发现的潜在资源之一是我自制的 Matrix 类。它使用映射的 STL 映射(即 map<int, map<int, double> > 来存储矩阵。我曾假设由于我使用了 STL,C++ 可以在程序执行结束时自动处理垃圾收集,但我现在想知道, 我是否需要对析构函数进行硬编码以先清除内部映射然后清除外部映射?

唯一的其他实例变量是几个整数,所以我看不到它们会导致任何问题。

为清楚起见,Matrix 类定义的相关部分:

class Matrix
{
    public:
        std::map< int, std::map<int, double> > elems;
        int rows;
        int cols;

        Matrix( );
        Matrix( int numRows, int numCols );

        // ... Getters, setters, operations and other miscellanea
}

(我意识到将我的实例变量声明为 public 是草率的 OO 实践,但这对你来说是 hacky 研究代码!)。

如果不是析构函数,我想知道它是否在以下代码中的某处:

    Matrix D;
    distance_cost( &D, &traj1, &traj2 ); // Init Matrix and flesh out data
    plhs[1] = mxCreateDoubleMatrix( D.rows, D.cols, mxREAL ); // Prepare output
    D_output = mxGetPr( plhs[1] );
    D.toDouble( D_output ); // Convert Matrix data maps to double* for Matlab

哪里distance_cost定义如下:

void distance_cost( Matrix *Q, Trajectory *A, Trajectory *B) {

    int M = A->length( );
    int N = B->length( );

    (*Q) = Matrix( M, N );

    for( int m=0; m < M; m++ ) {
        for( int n=0; n < N; n++ ) {
            float dist = A->at(m).dist2D( B->at(n) );
            Q->set(m,n,dist);
        }
    }

}

toDouble()是:

void Matrix::toDouble( double *dbl ) const {
    for( int i=0; i < this->rows; i++ ) {
        for( int j=0; j < this->cols; j++ ) {
            dbl[i+j*this->rows] = this->at(i,j);
        }
    }
}

欢迎任何对我草率使用内存管理的帮助、建议或批评 - 我已经把自己陷入了泥潭,无法真正弄清楚如何摆脱它!

最佳答案

如果这些都是Matrix中的所有成员变量,那么你很可能没事。

  • std::map< int, std::map<int, double> > elems;
  • int rows;
  • int cols;

特定函数总是有可能泄漏内存。但是从您向我们展示的内容来看,您不会泄漏任何内存。

关于c++ - Mex 类内存泄漏 - STL 映射是否需要析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15007349/

相关文章:

c++ - 错误 C2823 : a typedef template is illegal - function pointer

c++ - 被调用者如何知道参数是通过寄存器而不是堆栈传递的

c++ - 守护进程子无法执行库

c++ - 这是函数声明吗?

matlab - 当字符串可能包含少于 4 个字母时,从 matlab 中的字符串中提取前 4 个字母

memory-leaks - 使用 gstbuffer 时内存泄漏

arrays - 如何从一个数组中删除另一个数组的元素?

python - 从 python 运行 MATLAB 脚本 + 传递参数

java - 在 Java 应用程序中使用 JAXBContext 解决内存泄漏

java - 这种形式的内存管理在 Java 中是否有意义?