1

我正在处理 OpenCV 中的 3D 稀疏矩阵,当我尝试调用 cv::SparseMat 的发布方法时出现此访问冲突错误(http://docs.opencv.org/modules/core/doc/basic_structures.html#稀疏释放)。

还有一些关于 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

问题是:“const int sizes[]”。这意味着您在函数 Test() 中在堆栈上(而不是在堆上)创建数组。当你离开函数时它会自动释放,所以稍后试图释放这个内存会导致异常。实际上,任何在堆栈上释放内存的尝试都是“有问题的”。

于 2013-10-31T09:42:05.760 回答
0

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

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

于 2013-11-02T13:30:04.203 回答
0

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

于 2017-04-03T13:46:50.173 回答