c c 中記憶體洩漏的檢查與避免

2021-08-15 05:10:51 字數 1881 閱讀 2436

valgrind支援的工具:memcheck addrcheck cachegrind massid helgrind callgrind

執行時必須指明想用的工具,如果省略工具名,預設執行memcheck

檢測原理:

1,當要讀寫記憶體中的某個位元組時,首先檢查這個位元組對應的a bit。如果該a bit顯示該位置是無效位置,memcheck則會報告讀寫錯誤。

2,核心(core)類似於乙個虛擬的cpu環境,這樣當記憶體中的某個位元組被載入到真實的cpu時,該位元組對應的v bit也會被載入到虛擬的cpu環境中。一旦暫存器中的值,被用來產生記憶體位址,或者該值能夠影響程式輸出,則memcheck會檢查對應的v bits,如果該值尚未初始化,則會報告使用未初始化記憶體錯誤。

mtrace是乙個c函式,在

#include 

#include

#include

using

namespace

std;

int main()

執行: g+

+−wa

ll−g

main

.cpp

−oma

in生成

main

執行./

main

生成ou

tput

檔案檢視

outp

ut檔案

g ++

−wal

l−gm

ain.

cpp−

omai

n生成m

ain運

行./m

ain生

成out

put文

件檢視o

utpu

t文件mtrace main output

- 0x0000000002570c20 free 8 was never alloc'd 0x7fbecf080e9d

- 0x0000000002570e30 free 9 was never alloc'd 0x7fbecf14b91f

- 0x0000000002570e60 free 10 was never alloc'd 0x7fbecf1bb23c

memory not freed:

-----------------

address size caller

0x00000000025712f0 0x4 at 0x7fbecf49ee78

0x0000000002571330 0x4 at /home/tl/program/c/ipc/testmtrace.c:45

注意,編譯testmtrace.c檔案時,要加上-g,最後才會提示具體在哪一行沒有洩漏,而且,mtrace其實只是重寫了malloc的鉤子函式,所以只對malloc的記憶體洩漏檢查有效。

實現原理:

過載的 operator new 函式版本中,我們將呼叫全域性的 operator new 的相應的版本並將相應的 size_t 引數傳入,而後,我們將全域性 operator new 返回的指標值以及該次分配所在的檔名和行號資訊記錄下來,這裡所採用的資料結構是乙個 stl 的 map,以指標值為 key 值。當 operator delete 被呼叫時,如果呼叫方式正確的話(呼叫方式不正確的情況將在後面詳細描述),我們就能以傳入的指標值在 map 中找到相應的資料項並將之刪除,而後呼叫 free 將指標所指向的記憶體塊釋放。當程式退出的時候,map 中的剩餘的資料項就是我們企圖檢測的記憶體洩漏資訊--已經在堆上分配但是尚未釋放的分配資訊。

C C 檢查記憶體洩漏

最近剛換工作,還在試用期,分配給我的也都是些零碎的任務。前陣子領導扔給我乙個小專案,這個專案底層使用c 編寫的3d渲染引擎,然後用cli包裝了一下,提供給上層的c 呼叫。這個專案存在比較嚴重的記憶體洩漏問題,由於目前公司寫c 的人寥寥無幾,寫c 的又不太懂如何檢測c 的記憶體洩漏,領導就把這個小任務...

C C 記憶體洩漏檢查之經驗

c程式中最可怕的事情就是碰到記憶體洩漏或者記憶體錯誤,特別是對於大型的專案而言要去查乙個小小的記憶體洩漏可要花不少功夫的。目前已經有很多這方面的工具,比較著名的如rational purify,不過purify對linux的支援比較少,而且有一種洩漏是由於執行過程中不斷增長但是在程式結束的時候釋放的...

如何檢查C 中的記憶體洩漏

如何檢查c 中的記憶體洩漏 記憶體洩漏是程式設計中常常見到的乙個問題,我所遇過的原因有兩個 1.分配完記憶體後忘記 2.有問題,造成想 卻無法 例如 int p new int p new int p指標修改,原來申請記憶體的位址沒有記錄下來,於是無法釋放 下面介紹如何檢查記憶體洩漏 1.包含標頭檔...