gpt4 book ai didi

c++ - 使用 OpenCV 在 VS2005 中出现堆损坏错误?

转载 作者:行者123 更新时间:2023-11-28 08:31:56 25 4
gpt4 key购买 nike

当我尝试调试这个简单的代码时,我收到一个名为“堆损坏”的错误,

        CvCapture* capture = cvCaptureFromFile("1.avi");

if( capture )
{
cvNamedWindow( "Motion", 1 );

while(true)
{
//Grab the frame and display the image
//No need of this, because error is coming in the cvCaptureFromFile("1.avi");
}
}

但实际问题是,如果我尝试运行代码的 .exe(调试输出)(不是通过 vs2005),就不会出现该错误。谁能帮我解决这个问题?谢谢...

最佳答案

只有在调试器下运行时才会收到“堆损坏”错误消息的原因是当您在调试器中时堆正在帮助您。

具体来说,Windows CreateHeap() 函数将检查进程是否正在被调试。如果是这样,则相当于使用标志 HeapEnableTerminationOnCorruption 调用 SetHeapInformation()。这是作为查找和调试堆损坏的帮助提供给您的。它并非始终提供,因为相关的性能损失。

如果您在程序启动后附加调试器,而不是从调试器中启动程序,则 CreateHeap() 调用将已经通过并且堆将在正常模式下运行。

堆损坏是由超出从堆返回的 block 的边界写入引起的。例如,将 16 字节的字符串复制到 8 字节的分配中。从堆返回的 block 的边界之外是堆数据结构使用的结构。例如,可能会在分配的 block 周围找到链表指针。

当您的程序写入超出 block 的边界时,它可能会或可能不会碰到周围的信息并导致崩溃。如果程序中出现堆溢出,您可能很难检测到。然后在用户的机器上,堆溢出可能总是会导致崩溃。

为了避免释放代码时出现堆溢出的尴尬,CreateHeap() API 试图通过配置堆来为您提供更多信息来帮助您。

但是,我无法告诉您需要使用 OpenCV 做什么才能完成这项工作。您确定在 cvNamedWindow() 之前不需要调用其他设置例程吗?

在调试器中,您能否在显示终止消息的 API 上设置断点?尝试在 FatalAppExit()ExitProcess() API 上设置断点,以准确查看堆何时生成其投诉。它是在调用 cvNamedWindow() 之前还是之后?

关于c++ - 使用 OpenCV 在 VS2005 中出现堆损坏错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com