我正在寻找一些mex代码中的内存泄漏(正在工作的IT支持人员尚未安装有用的调试标志,这使Valgrind变得无用了...)。
我发现的潜在来源之一是我自制的Matrix类。它使用 map 的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
}
(我意识到将我的实例vars声明为public是草率的OO做法,但这对您来说是骇人的研究代码!)。
如果不是析构函数,我想知道它是否在以下代码中:
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/