0xc0000374 未附加调试时 Cli/Cpp 代码中的堆损坏

Posted

技术标签:

【中文标题】0xc0000374 未附加调试时 Cli/Cpp 代码中的堆损坏【英文标题】:0xc0000374 Heap Corruption in Cli/Cpp code when debugging is not attched 【发布时间】:2014-06-17 11:32:11 【问题描述】:

我在我的 Cli/cpp 项目中遇到了堆损坏问题。

似乎只有在未附加调试器或未使用依赖项步行工具进行分析时才会出现问题。

在我看来,应用程序在释放一些内存时首先崩溃。

如果有人可以看一下,请告诉我我是否在以下代码中做了一些非常糟糕的事情,这可能会导致这种情况。

std::string imagePath = msclr::interop::marshal_as< std::string >(Path::Combine(this->context->WorkingDirectory, this->context->Payload->ImagePath));
std::cout << imagePath << std::endl;
cv::Mat image = cv::imread(imagePath);

if (!image.data)

    throw gcnew System::Exception("image data is not loaded");



std::vector<cv::Point2f> src;
src.push_back(cv::Point2f(0, 0));
src.push_back(cv::Point2f(0, image.rows));
src.push_back(cv::Point2f(image.cols, image.rows));
src.push_back(cv::Point2f(image.cols, 0));

cv::Mat M = cv::getPerspectiveTransform(src, dst);

cv::Mat warp_img((ymax - ymin + 1)*tileSize, (xmax - xmin + 1)*tileSize, CV_8UC3);



std::vector<cv::Point2f> obj_corners(4);
obj_corners[0] = cv::Point(0, 0); obj_corners[1] = cv::Point(image.cols, 0);
obj_corners[2] = cv::Point(image.cols, image.rows); obj_corners[3] = cv::Point(0, image.rows);

std::vector<cv::Point2f> scene_corners(4);

cv::perspectiveTransform(obj_corners, scene_corners, M);

cv::warpPerspective(image, warp_img, M, cv::Size((xmax - xmin + 1)*tileSize, (ymax - ymin + 1)*tileSize));
image.release();


cv::Mat warp_img_fliped;
cv::flip(warp_img, warp_img_fliped, 0);
warp_img.release();

String^ id = Guid::NewGuid().ToString();

std::vector<int> compression_params;
if (this->context->Payload->Extension->Equals(".png"))
    compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);


if (this->context->Payload->Extension->Equals(".jpg"))
    compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(this->context->Payload->Quality);



for (int r = 0, rr = (ymax - ymin + 1)*tileSize, ty_idx = ymax; r < rr; r += tileSize, ty_idx--)
    for (int c = 0, cc = (xmax - xmin + 1)*tileSize, tx_idx = xmin; c < cc; c += tileSize, tx_idx++)
    
        std::cout << ty_idx << " " << tx_idx << std::endl;

        cv::Mat tile = warp_img_fliped(cv::Rect(c, r, tileSize, tileSize)); 

        String^ Path = Path::Combine(this->context->WorkingDirectory, id,String::Format("0\\1\\2\\3", zoom,tx_idx,ty_idx, this->context->Payload->Extension));
        Directory::CreateDirectory(Path::GetDirectoryName(Path));               
        std::string path = msclr::interop::marshal_as< std::string >(Path);
        cv::imwrite(path, tile, compression_params);
    

warp_img_fliped.release();

【问题讨论】:

次要帮助:检查未在 ctor 中初始化的类成员。 (这可能很明显) 现在没有什么是显而易见的 :) 另一点:确保您没有将调试与发布库混为一谈。我不知道为什么,但我观察到在使用 CV 时会这样做 【参考方案1】:

所以错误甚至在我上面发布的代码之前。

通过一次取一行并返回,我能够找到堆损坏的原因。

double pxpy[2] =  (double)xmin * tileSize, (double)ymin * tileSize ;  
pixelsToMeters(pxpy, zoom, initialResolution, mxmy);

上面的作品和下面是导致错误的原因

pixelsToMeters(new double[]  (double)xmin * tileSize, (double)ymin * tileSize , zoom, initialResolution, mxmy);

【讨论】:

以上是关于0xc0000374 未附加调试时 Cli/Cpp 代码中的堆损坏的主要内容,如果未能解决你的问题,请参考以下文章

程序崩溃并出现 0xC000000D 并且没有异常 - 我该如何调试它?

样式 TargetType 在未附加到调试器时会导致 XamlParseException

代码退出 -1073741515 (0xc0000135) '未找到依赖的 dll'

WebService附加到IIS调试,未命中断点

Sample.exe 中 0x7537812f 处的未处理异常:0xC0020001:字符串绑定无效 [重复]

Android Studio 附加到进程未找到本机符号