0

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

        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),则不会出现该错误。谁能帮我解决这个问题?谢谢...

4

2 回答 2

1

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

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

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

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

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

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

但是,我无法告诉您如何使用 OpenCV 来完成这项工作。您确定在cvNamedWindow().

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

于 2009-10-16T18:31:25.017 回答
0

这可能意味着 OpenCV 无法加载 AVI。我总是将我的视频转换为 RAW I420 格式;这完美加载。

以下命令将使用MEncoder将视频转换为这种格式:

mencoder -ovc raw -nosound -vf format=i420 -o "%OUTPUT%" "%INPUT%"

where%INPUT%%OUTPUT%是输入和输出文件。

于 2009-10-19T10:17:58.497 回答