【问题标题】:Heap error reported by Visual Studio, but only in debug modeVisual Studio 报告的堆错误,但仅在调试模式下
【发布时间】:2012-05-03 17:25:51
【问题描述】:

我正在开发一个使用多个库(SDL、Boost、Chipmunk、Lua、Glew)的大型程序

每当我将此代码添加到构造函数中的某个类时。

std::ifstream is;
is.open ("Sprites/spriteList.json");// Causes Error
boost::property_tree::ptree pt;
boost::property_tree::json_parser::read_json(is,pt);// Causes Error

Visual Studio 创建一个指向此代码的错误堆错误。

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer(
        const void * pUserData
        )
{
        if (!pUserData)
            return FALSE;

        if (!_CrtIsValidPointer(pHdr(pUserData), sizeof(_CrtMemBlockHeader), FALSE))
            return FALSE;

        return HeapValidate( _crtheap, 0, pHdr(pUserData) );
}  

但仅在调试模式下,发布时它不会出错并且运行良好。即使我将代码放在一个块中,也会出现此错误,因此它永远不会运行。

if (false) {
    std::ifstream is;
    is.open ("Sprites/spriteList.json");
    boost::property_tree::ptree pt;
    boost::property_tree::json_parser::read_json(is,pt);
}

谁能慢慢解释发生了什么,或者给我一个链接来修复它。

【问题讨论】:

  • 这个问题可能也出现在非调试模式下,但是库不会花任何时间来发现问题。它会全速前进并破坏堆,这通常会导致崩溃——尽管我观察到你声称它没有崩溃(这只表明你没有遇到错误,而不是错误不存在)。
  • 如果它包含在永远不会运行的 if 语句中,我不确定它是如何破坏堆的。
  • 堆在其他地方被破坏。它只是在这里被发现。这就是为什么内存损坏问题如此隐蔽的原因。该问题可能由远离检测点的操作触发,导致臭名昭著的Heisenbug。要么,要么你调试的代码与你认为调试的代码不同,要么你忘记重新编译,或者其他类似的东西。总体而言,与某处真正的内存损坏相比,这不太可能成为问题。

标签: c++ visual-studio visual-studio-2010


【解决方案1】:

我最近做了一个 winupdate(20120508),之后 Visual Studio 2010 的调试似乎真的很慢 在 compile-to-runDebug 滞后后延迟 1 分钟,然后当调试程序退出时,再延迟 1 分钟 再次获得视觉工作室的控制权。我确实清理了所有东西,但没有任何乐趣。

解决方案:我手动删除了我的项目/解决方案中的大 *.sdf 和 *.suo 文件并重新构建。问题神奇地消失了。

不知道为什么,但有些东西不同步、损坏或与更新不兼容,需要手动删除。

【讨论】:

  • 我遇到了同样的问题,删除 *.suo 文件解决了我的问题,但只是暂时的。我需要不断删除该文件以获得简短的临时解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多