0

我正在使用以下代码:

#include <iostream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

    int main(int argc, char* argv[])
    {
        const string ipImgName= argv[1];
        Mat ipImg;
        ipImg = imread( ipImgName, 1 );

        cv::Mat gcImg;
        cv::Mat bgdModel;
        cv::Mat fgdModel;
        cv::Rect rect(0, 0, ipImg.cols-1, ipImg.rows-1);
        cv::grabCut( ipImg, gcImg, rect, bgdModel, fgdModel, 1, cv::GC_INIT_WITH_RECT ); 


        return 0;
    }

但是当退出主循环时,当调试器进入~Mat()析构函数时,gcImg 或 bgdModel 或 fgdModel 的代码会崩溃release()(说“这可能是由于堆损坏”)。

但是,如果我在堆上分配cv::Mats 使用new然后不删除它们,代码运行得很好。我正在使用带有 OpenCV 2.3.1 的 Visual Studio 2010。

4

1 回答 1

0

如果您正在运行与 Release 库链接的 Debug 构建,则由于使用了不同的内存分配例程,您可能会报告这个虚假的“错误”。

在调试版本中,内存分配在分配块的任一端受到保护字节的保护,并对损坏、泄漏等执行各种检查。在发布版本中,不执行这些检查,并且当您混合调试和发布代码时,分配的内存一个与另一个一起释放,这是您看到的典型错误。

这实际上不是一个真正的错误,只是混合不同运行时的副作用。MSDN 有更多细节

于 2013-08-19T05:05:51.877 回答