小記:Linux下的堆破壞

來源:互聯網
上載者:User
    今天遇見一個超鬱悶的BUG,現象非常奇怪:
delete pointer;
   刪除一個指標的時候程式發生core dump,或者在此處掛死。
  從原理上分析,new出來的一塊記憶體,會在記憶體的頭或者尾處加上一個標記,說明塊記憶體的大小。
  我猜想,一定是指標越界,導致了開始或者末尾的這塊標記被破壞,所以delete發生掛死。
  檢查了若干次後,也沒發現指標越界的情況。
  而且單獨寫了一個程式來故意破壞new出來的記憶體塊的開頭和結尾,結果指標越界的時候,程式立即core dump,說明Linux作業系統明確禁止了越界的指標。

   實在沒辦法,採用逐行注釋的辦法,最終定位到一個一行代碼上。檢查這行代碼所在的類,仍沒發現這個方法有問題。
   於是把這個類單獨提取出來,類比同樣的new和delete操作,最後才發現是Close()方法中,delete掉一個內部的指標後沒有賦值為NULL,然後解構函式中又調用Close(),導致一塊記憶體連續被釋放兩次。

   奇怪的是,這個類發生的記憶體問題,並沒有在第二次delete的時候發生問題,而是在我自己的代碼中,delete另一個指標的時候發生掛死————我取名為堆破壞。如果不閱讀LINUX的源碼,還沒辦法說明為什麼會這樣。

   還奇怪的是,我當時調試用的LINUX伺服器是2.4核心的,當把有問題的代碼放到2.6核心的伺服器上調試時,完全沒問題,看來linux 2.6核心能夠對兩次delete同一指標的問題進行容錯。

   說了那麼多,總結一下:注意,Linux 2.4核心的作業系統中,兩次delete同一記憶體後,將發生堆破壞,再次delete其他指標的時候可能發生core dump或者掛死!
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.