2012-11-01 66 views
5

我在試着瞭解如何使用_CrtCheckMemory來跟蹤我正在處理的Windows應用程序中的堆損壞情況。我似乎無法得到它返回false。這裏是我的測試代碼:_CrtCheckMemory使用示例

int* test = new int[1]; 
for(int i = 0; i < 100; i++){ 
    test[i] = 1; 
} 
assert(_CrtCheckMemory()); 

在上面的代碼中,_CrtCheckMemory()返回true。我在調試模式下運行。我還需要做什麼才能獲得標記問題的簡單示例_CrtCheckMemory

回答

6

需要執行額外的步驟,您必須說服編譯器用調試分配器替換缺省的新的運算符。只有調試分配器纔會創建檢測堆塊的覆蓋不足或覆蓋的「無人區域」區域。這是有風險的,使用原始分配器編譯的代碼將不會與不符合的代碼混合。所以它迫使你明確地選擇加入。

這是最好在預編譯頭文件(默認爲stdafx.h)中完成的,因此您可以確定所有代碼都使用調試分配器。就像這樣:

#ifdef _DEBUG 
# define _CRTDBG_MAP_ALLOC 
# define _CRTDBG_MAP_ALLOC_NEW 
# include <crtdbg.h> 
# include <assert.h> 
#endif 

的CRTDBG宏得到的malloc()函數和運營商所取代。

請注意,您發佈的代碼將首先觸發另一個診斷。在Windows Vista及更高版本中,Windows堆分配器將首先發出抱怨,因爲代碼破壞了Windows堆堆的完整性。通過編制索引來使覆蓋有點微妙,例如只有2個。

+0

嗯。將預編譯器的東西添加到stdafx.h和一個依賴項目中,並且在我的數組覆蓋之後仍然沒有停止。我會在這一點上撓頭。顯然有一些叫做gflags的東西可能也能幫助我。 – morgancodes

+0

我使用你的代碼發佈之前,我測試了這個。工作很好。如果您使用其他工具,gflags很有用,例如umhd.exe –

+0

謝謝。建立一個新的,簡單的項目,以便我可以看到_CrtCheckMemory實際上工作。 – morgancodes