1

私は OpenCV で 3D スパース行列に取り組んでおり、cv::SparseMat のリリース メソッドを呼び出そうとすると、このアクセス違反エラーが発生します ( http://docs.opencv.org/modules/core/doc/basic_structures.html# sparsemat-release )。

また、OpenCV のメモリ管理に関するメモ: http://docs.opencv.org/modules/core/doc/intro.html#automatic-memory-management

これが私の問題の分離されたバージョンです:

int main(int argc, char *argv[])
{
    cv::SparseMat smat2;

    smat2 = Test();
    smat2.release(); //access violation error
}

cv::SparseMat Test()
{
    const int sizes[] = {480, 640, 3000};
    cv::SparseMat mat(3, sizes, CV_8SC1);
    return mat;

}

エラーが発生する内部コードは次のとおりです。

inline void SparseMat::release()
{
    if( hdr && CV_XADD(&hdr->refcount, -1) == 1 )
        delete hdr; // <--- HERE!
    hdr = 0;
}

メモリ管理と C++ については、しばらく時間がかかりました。どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

1

問題は次のとおりです。「定数 int サイズ []」。これは、関数 Test() で (ヒープではなく) スタックに配列を作成していることを意味します。関数を終了すると自動的に割り当てが解除されるため、後でこのメモリを解放しようとすると例外が発生します。実際、スタック上のメモリを解放しようとする試みは「問題あり」です。

于 2013-10-31T09:42:05.760 に答える