【发布时间】: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