在實際項目中調試分段錯誤時,在長時間運行後發生崩潰並且隨機測試不容易重現。崩潰點顯示崩潰的函數寫入類似於可以在動態分配的內存上調用memset導致堆損壞
void deallocateObject(objectType* ptr)
{
ASSERT(ptr);
if(!ptr)
return;
if(ptr->customDeallocator)
ptr->customDeallocator->deallocate();
else
free(ptr);
}
在項目中使用了各種類型的allocator和deallocator。 爲了驗證分段錯誤不是因爲分配的內存在釋放後未被設置爲NULL,我在此函數中的最後一條語句之後向memset添加了一個調用。
memset(ptr, 0, sizeof(objectType));
但是在這個改變之後,我開始每次都有崩潰的消息說堆已損壞。
所以我的問題是如何以及在什麼情況下調用memset()可能導致堆損壞。
您在'free(ptr)'之後調用'memset(ptr ...'?顯然這是未定義的行爲 –
不能觸及釋放的內存使用像Valgrind這樣的工具來調試內存錯誤 –
聲明之後, d你再次檢查NULL? –