2

私はいくつかの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);
        }
    }
}

私のメモリ管理の雑な使い方についての助け、アドバイス、批判は歓迎されます-私はかなりの泥沼に身を投じて、それから抜け出す方法を本当に理解することができません!

4

1 に答える 1

1

これらがのすべてのメンバー変数である場合はMatrix、問題がない可能性が非常に高くなります。

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

特定の機能がメモリリークを起こしている可能性は常にあります。しかし、あなたが私たちに示したことから、あなたはどんな記憶も漏らさないでしょう。

于 2013-02-21T16:36:23.723 に答える