Free Heap block XXXXXX modified at XXXXXX after it was freed
相信不少朋友碰到過以上問題,而往往苦於無法定位到錯誤的代碼位置,其實出現該問題一般就是使用了野指標導致的.
那麼何為野指標呢?
野指標與NULL指標不同.所謂野指標是指指標所指的記憶體已經回收,而繼續使用該指標,導致未定義行為.
例如:
char *p = new char[512];</p><p>*p = '/0';</p><p>delete[] p;</p><p>*p = 'a'; // 此處出現了野指標<br />
所以為了避免此類問題。往往採用刪除後立即清null 指標變數的方法
delete []p;<br />p = NULL; // 進行置NULL<br />*p = 'a'; // 這裡調試器將給出提示,成功定位錯誤位置
這樣看似很好解決野指標的問題,其實不然,因為要知道記憶體刪除與指標變數使用往往是脫節的。
例如:
char *p = new char[512];<br />char *q = p;</p><p>*p = '/0';</p><p>delete[] p;<br />p = NULL;</p><p>*q = 'a'; // q與記憶體刪除代碼往往不在同一地點,沒辦法指定q=NULL;所以照樣出現了野指標。<br />
那麼此類問題如何定位呢?
這裡就要利用文章開頭寫的那個提示資訊了。
Free Heap block d49418 modified at d49574 after it was freed
這句話的意思是,釋放了記憶體開始為0xd49418的堆塊後,堆塊所在記憶體的0xd49574位置被更改了。
這樣就好辦了,我們只需要尋找到0xd49418所在位置屬於分配給了哪個對象,然後再定位0xd49574所處的成員變數
然後尋找所有使用該變數並進行了變數內容的修改的代碼就可以定位到錯誤位置了。再根據情況修改代碼,避免記憶體釋放後仍然進行修改即可。