我正在使用多个库的大型程序(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);
}
谁能解释慢慢发生了什么事,或点我一个链接来修复它。
该问题可能也发生在非调试模式下,但库不会花费任何时间发现问题。它会全速前进并破坏堆,这通常会导致崩溃 - 尽管我观察到你声称它不会崩溃(这只表明你没有碰到错误,并不是错误不存在)。 –
我不确定如果它被包含在一个永远不会运行的if语句中,它会如何破坏堆。 – user315684
堆正在其他地方被损坏。这只是在这里发现。这就是为什么记忆腐败问题如此阴险。这个问题可能会由于检测到这些行为很长的时间而触发,导致臭名昭着的[_Heisenbug_](http://en.wikipedia.org/wiki/Heisenbug)。要么是这样,要么你没有调试你认为你正在调试的代码,或者你忘记了重新编译或者其他的东西。总的来说,这不太可能成为问题,而不是真正的内存破坏。 –