【问题标题】:error in visual studio 2010/ corruption of the heapVisual Studio 2010 中的错误/堆损坏
【发布时间】:2013-11-14 08:26:35
【问题描述】:

我可以编译我的代码,但是当我尝试运行它时,我得到了这个错误:

这可能是由于堆损坏,这表明 .exe 文件或其已加载的任何 DLL 中存在错误

我试图调试它,但奇怪的是,我把断点放在哪里都没有关系,我再次得到这个错误:(

有谁知道问题出在哪里?

在得到一些建议后,我清理了代码并且它工作了,但现在我正在努力解决一个新的内存分配错误:

#define CV_HOUGH_GRADIENT 3;
Mat Valv;
   if( sumValv[0] > sumValv[0]){
      vector<Vec3f> circles;
      HoughCircles( Valv, circles, 3 , 1, Valv.rows/8, 200, 100, 0, 0 );
}

我正在使用 opencv 库,我将使用 HoughCircles 函数检测图像中的圆圈。 我在 HoughCircles 行中收到错误...内存分配错误:( 不知道是什么原因...

【问题讨论】:

  • 请确保在退出程序之前清理所有程序堆内存
  • 除了 ComicSansMS 给出的好建议之外,您是否在应用程序中使用了任何 dll?如果是这样,请确保它们都是使用 Visual Studio 2010 编译的,并且您没有混合调试和发布。我的意思是在调试应用程序中使用 Release dll 也很糟糕,反之亦然。
  • @Subhajit:谢谢,我清理了代码,现在可以使用了 :)
  • @user2758510 请注意,如果您确实遇到了堆损坏,您的更改可能只是掩盖了问题。您应该花一些时间来确保您的代码中没有任何无效的堆操作。
  • @ComicSansMS:你完全正确..似乎问题远不止于此!我将重新编辑我的问题。

标签: c++ visual-studio-2010 opencv image-processing


【解决方案1】:

Visual C++ 的调试运行时在分配的内存块之间插入special character sequences。如果它检测到其中一个魔法模式被覆盖,它会将其报告为堆损坏。

此类错误的问题在于,它们通常仅在实际损坏发生一段时间后才被发现。因此,您在报告损坏时获得的调用堆栈可能与实际问题无关。

确保检查代码是否存在可能导致越界写入的不受约束的内存访问。像AppVerifierVTune 这样的内存诊断工具可以帮助找出问题,但通常这些错误很难调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多