關於記憶體洩露,大概半年前曾查過一次,也寫過總結,但太粗了,現在看來參考價值不怎麼大。
無論windows的crt庫函式方式,如crtmemstate,_crtmemcheckpoint,_crtmemedifference,_crtdumpmemoryleaks,_crtmemdumpallobjectssince等,或者windows其他記憶體洩露的檢查工具,甚至是與系統無關的檢查方式,只要時原始碼形勢的,一般都是通過替換new,malloc,delete,free的實現。
c++中的new可以過載,譬如為
void * operator new(size_t nsize, const char * filename, int nline)
void * operator new(size_t nsize, const char * filename, int nline)
在實現中將可以依然呼叫全域性的new,如::operator new 也可使用malloc分配記憶體,並將得到的位址,new的呼叫處的檔名,行數儲存起來即可,為此可以使用map這裡***為要儲存的內容組成的結構。
在delete的實現中可以從map中清除此節點。
如此在乙個需要測量的週期之後,沒有被delete掉的就扔保留在此map中了,可以通過遍歷此馬匹得到申請記憶體的檔名及所在行。
但什麼時間用過載什麼時間不用呢,如果全部用了,必將對頭檔案中的尤其是系統標頭檔案造成影響。我們只需要在我們的**中使用即可。如此以來,只需在原始檔的include與之後,**之前新增#define new dbg_new即可,其中#define dbg_new new(__file__,__line__)可以預先定義好。
對於malloc則沒有過載一回事了,但可以另造乙個函式,例如windows crt中的實現
#ifdef _crtdbg_map_alloc
#define malloc(s) _malloc_dbg(s, _normal_block, __file__, __line__)
#define calloc(c, s) _calloc_dbg(c, s, _normal_block, __file__, __line__)
#define realloc(p, s) _realloc_dbg(p, s, _normal_block, __file__, __line__)
#define _expand(p, s) _expand_dbg(p, s, _normal_block, __file__, __line__)
#define free(p) _free_dbg(p, _normal_block)
#define _msize(p) _msize_dbg(p, _normal_block)
#endif
即通過_malloc_dbg實現的記憶體分配,_malloc_dbg的實現中呼叫了_nh_malloc_dbg,後者在乙個雙向鍊錶_crtmemblockheader中維護這記憶體的分配與釋放。
因為_malloc_dbg 與 _nh_malloc_dbg的實現在dbgheap.c檔案中,如果想要修改這裡面的**啊,除非重新編譯c庫,否則並不會生效。
我曾試圖修改_malloc_dbg,使得對分配指定大小的記憶體時執行乙個打了斷點的簡單語句,從而方便跟蹤,但因為如上原因未能生效,變通的實現是自己在工程中加了_malloc_dbg2 在這個函式內修改,並#define malloc(s) _malloc_dbg2(s,_normal_block, __file__, __line__)實現。
以上實現,完全可輕易寫出不依賴平台的**的...
值得提醒的是,如果在**中呼叫了第三方庫,而記憶體是在裡面申請的,則這是跟不到的。近期乙個記憶體洩露,不停的提醒如果平台庫中申請的記憶體是跟不到的,偏偏忘了是openssl的庫,到了最後被查出來了才恍然大悟,原來是evp框架初始化申請了記憶體卻沒有cleanup造成的。
openssl有自己的記憶體維護機制,可以檢查並報告記憶體洩露。以前08,09年左右還研究使用過,現在分析時頭腦浮現了兩次,卻始終沒在上面深入,慚愧啊。
神策軍丨我申請轉正
篳路藍縷,以啟山林 在工作中,認定自己擁有一往無前的勇氣,可手無寸鐵禦敵,也可襤褸艱苦開山,入職時正值 2020 疫情峰期過後全國復工浪潮,轉正時又恰好上海疫情突發,與在神策的經歷很像,一路困難重重以為在森林裡迷路,仔細一看原來都是撥得開的迷霧。知道神策技術很牛才奔此而來,果不其然,想要花時間好好把...
WM630 107 轉儲申請建立轉儲訂單
tr自動建立to spro 後勤執行 倉庫管理 介面 庫存管理 定義移動型別 a im建立物料憑證的時候,後台自動建立to x im建立物料憑證的時候,自動調整到建立to介面 後台處理,當建立報錯時message訊息報錯給誰,可以是當前登入賬號,也可以指定接收人 例如後台呼叫,報錯訊息指定給運維人員...
coredump Linux記憶體轉儲
coredump 簡單來說,core dump說的是作業系統執行的乙個動作,當某個程序因為一些原因意外終止 crash 的時候,作業系統會將這個程序當時的記憶體資訊轉儲 dump 到磁碟上1。產生的檔案就是core檔案了,一般會以core.形式命名。如何產生core dump 一般來說,當程序接收到...