再談野指標問題Free Heap block xxx modified at xxx after it was freed

來源:互聯網
上載者:User

 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所處的成員變數

然後尋找所有使用該變數並進行了變數內容的修改的代碼就可以定位到錯誤位置了。再根據情況修改代碼,避免記憶體釋放後仍然進行修改即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.