我正在使用多個庫的大型程序(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)。要麼是這樣,要麼你沒有調試你認爲你正在調試的代碼,或者你忘記了重新編譯或者其他的東西。總的來說,這不太可能成爲問題,而不是真正的內存破壞。 –