私はいくつかのmexコードでメモリリークを探しています(私が働いているITサポートは有用なデバッグフラグをインストールしておらず、Valgrindを役に立たなくしています...)。
私が見つけた潜在的な情報源の1つは、自家製のMatrixクラスです。マップのSTLマップを使用します(つまりmap<int, map<int, double> >
、マトリックスを格納します。STLを使用したおかげで、C ++はプログラム実行の最後にガベージコレクションを自動的に処理できると思っていましたが、今は疑問に思っていますか?最初に内側のマップをクリアし、次に外側のマップをクリアするために、デストラクタをハードコーディングする必要がありますか?
他のインスタンス変数はいくつかのintだけなので、問題を引き起こしているものは見当たりません。
明確にするために、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
}
(私のインスタンス変数をパブリックとして宣言することは、お粗末な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);
}
}
}
私のメモリ管理の雑な使い方についての助け、アドバイス、批判は歓迎されます-私はかなりの泥沼に身を投じて、それから抜け出す方法を本当に理解することができません!