2012-05-03 48 views
2

我正在使用多个库的大型程序(SDL,升压,花栗鼠,Lua中,GLEW)堆错误,但仅在调试模式

当过我这个代码添加到构造函数中的某个Class。

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); 
} 

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

+3

该问题可能也发生在非调试模式下,但库不会花费任何时间发现问题。它会全速前进并破坏堆,这通常会导致崩溃 - 尽管我观察到你声称它不会崩溃(这只表明你没有碰到错误,并不是错误不存在)。 –

+0

我不确定如果它被包含在一个永远不会运行的if语句中,它会如何破坏堆。 – user315684

+0

堆正在其他地方被损坏。这只是在这里发现。这就是为什么记忆腐败问题如此阴险。这个问题可能会由于检测到这些行为很长的时间而触发,导致臭名昭着的[_Heisenbug_](http://en.wikipedia.org/wiki/Heisenbug)。要么是这样,要么你没有调试你认为你正在调试的代码,或者你忘记了重新编译或者其他的东西。总的来说,这不太可能成为问题,而不是真正的内存破坏。 –

回答

0

我最近做了一个winupdate(20120508)和Visual Studio 2010似乎是一个编译到runDebug滞后后,1分钟延时调试很慢事后 ,那么当调试程序退出,再过1分钟延迟 再次控制视觉工作室。我确实干净了一切,但没有欢乐。

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

不确定为什么,但某些内容不同步,损坏或与更新不兼容,需要手动清除。

+0

我有同样的问题,并删除* .suo文件解决我的问题,但只是暂时的。我需要不断删除该文件以获得简短的临时解决方案。 – tif

相关问题