小記 Linux下的堆破壞

2021-08-22 13:55:26 字數 789 閱讀 3649

今天遇見乙個超鬱悶的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或者掛死!

Linux下date命令的使用小記

linux系統下有兩類時鐘,一類是由linux核心通過cpu的工作頻率進行的,第二是由主機板產生的硬體時鐘。其中第一類時鐘可以通過linux命令 date 來檢視 如 root centos7 date sun jun 30 04 53 44 cst 2019 通過檢視linux幫助可以知道在dat...

linux下群發郵件小記

今天需要把一大堆 大約 300餘條 亂糟糟的 email位址整理好,並給他們發信通知一次學術會議的徵稿資訊。郵件使用 mutt msmtp。mutt msmtp 的配置 google一下到處都有,比如在 msmtp的官方 上提供的示例 http msmtp.sourceforge.net doc m...

linux下C C 開發小記2

dlopen函式介紹 void dlopen const char pathname,int mode 在這裡針對該函式的返回值,引數記錄下自己的理解。在載入庫失敗時會返回空指標,此時可以使用dlerror輸出錯誤原因,至於為什麼失敗會與傳入的引數有關。要動態載入的庫的名字,可以是相對路徑也可以是絕...