释放SparseMat时出现访问冲突错误

时间:2013-10-31 08:43:57

标签: c++ opencv sparse-matrix

我正在研究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 ++已经有一段时间了。任何帮助深表感谢。感谢。

3 个答案:

答案 0 :(得分:1)

问题是:“const int sizes []”。这意味着您正在函数Test()中的堆栈(而不是堆上)上创建数组。离开函数时会自动取消分配,因此稍后尝试释放此内存将导致异常。实际上,任何在堆栈上释放内存的尝试都是“有问题的”。

答案 1 :(得分:0)

这与我对OpenCV动态库的错误配置有关。当我复制正确的dll(\ Release下的opencv_core245.dll,\ Debug下的opencv_core245d.dll等)问题解决了。

虽然它仍然很有趣,我将我的%PATH%变量更改为包含C:\opencv\build\x64\vc11\bin文件夹,其中包含发布和调试dll,但我必须手动将dll文件复制到相应的项目文件夹。

答案 2 :(得分:0)

要解决此问题,如果要构建发布版本,则需要链接到正确的库opencv_world320.lib。或opencv_world320d.lib如果您正在构建调试版本(这假设3.2.0的版本OpenCV)。