2012-05-03 61 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

相關問題