国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C語言內(nèi)存泄漏之free、valgrind、examine

C語言內(nèi)存泄漏之free、valgrind、examine

先來介紹valgrind和examine這兩個(gè)工具的使用。

使用examine命令(簡(jiǎn)寫是x)來查看內(nèi)存地址中的值。x命令的語法如下所示:
x/<n/f/u> <addr>
n、f、u是可選的參數(shù)。
n 是一個(gè)正整數(shù),表示顯示內(nèi)存的長(zhǎng)度。

f 表示顯示的格式,其取值如下:

x 按十六進(jìn)制格式顯示變量
d 十進(jìn)制
u 十六進(jìn)制無符號(hào)整型
o 八進(jìn)制
t 二進(jìn)制
c 字符
s 字符串
f 浮點(diǎn)數(shù)
i 指令

u 表示從當(dāng)前地址往后請(qǐng)求的字節(jié)數(shù),其取值如下:

b表示單字節(jié)
h表示雙字節(jié)
w表示四字 節(jié)(默認(rèn))
g表示八字節(jié)

Valgrind 可以對(duì)編譯后的二進(jìn)制程序進(jìn)行內(nèi)存使用監(jiān)測(cè)(C語言中的malloc和free,以及C++中的new和delete),找出內(nèi)存泄漏問題。
Valgrind 中包含的 Memcheck 工具可以檢查以下的程序錯(cuò)誤:

使用未初始化的內(nèi)存 (Use of uninitialised memory)
使用已經(jīng)釋放了的內(nèi)存 (Reading/writing memory after it has been free’d)
使用超過malloc分配的內(nèi)存空間(Reading/writing off the end of malloc’d blocks)
對(duì)堆棧的非法訪問 (Reading/writing inappropriate areas on the stack)
申請(qǐng)的空間是否有釋放 (Memory leakswhere pointers to malloc’d blocks are lost forever)
malloc/free/new/delete申請(qǐng)和釋放內(nèi)存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])
src和dst的重疊(Overlapping src and dst pointers in memcpy() and related functions)
重復(fù)free

一般這樣使用就可以了:valgrind   --tool=memcheck   --leak-check=full   ./test

常見錯(cuò)誤解釋:

Invalid write of size 4

這可能是數(shù)組越界了

40 bytes in 1 blocks are definitely lost in loss record 1 of 1

內(nèi)存沒有釋放

下面講一下malloc()和free()到底干了些什么事。

malloc()之后這片內(nèi)存就是你的了,你就擁有使用權(quán)了。

free()只是將你以前申請(qǐng)的內(nèi)存塊插入到 heap 中,并檢測(cè)是否與 heap 中已有的內(nèi)存塊相鄰,如相鄰,則合并這兩塊,至于你自己定義的指針,仍保持原值,但已沒有空間,需要你自己手動(dòng)將其 指向 NULL。

free并沒有把內(nèi)存里的值清0,內(nèi)存里的值仍保持原樣。free之后仍然可以通過你的指針去訪問內(nèi)存,如果這片內(nèi)存沒有并操作系統(tǒng)挪作他用,那你訪問到的還是原來的值。當(dāng)然你這樣做是很危險(xiǎn)的,尤其在多線程環(huán)境下,你根本不知道這片內(nèi)存是否并操作系統(tǒng)挪作他用了。

解決一下下面的問題。

 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4
5 struct url{
6 char *domain;
7 char *path;
8 int depth;
9 };
10
11 void getUrl(struct url* rect){
12 char *line;
13 line=calloc(128,sizeof(char));
14 strcpy(line,"http://www.baidu.com /gaoji/preferences.html 2");
15 char *delim=" ";
16 rect->domain=strtok(line,delim);
17 rect->path=strtok(NULL,delim);
18 rect->depth=atoi(strtok(NULL,delim));
19 free(line);
20 }
21
22 main(){
23 struct url* rect;
24 rect=calloc(1,sizeof(struct url));
25 getUrl(rect);
26 printf("|%s|%s|%d|\n",rect->domain,rect->path,rect->depth);
27 free(rect);
28 printf("%s\n",rect->path);
29 printf("%d\n",sizeof(struct url));
30 }

結(jié)果輸出sizeof(struct url)為12。想一想為什么??jī)蓚€(gè)指針加一個(gè)int當(dāng)然是12字節(jié)了。

在19行free掉line之后,按照常理,rect->domain,rect->path,rect->depth就已經(jīng)不能再使用了,因?yàn)樗鼈冎赶虻亩际莑ine里面的內(nèi)容。但是我們卻用rect->domain,rect->path,rect->depth訪問到了內(nèi)存中相應(yīng)的值。這就解釋了free到底做了什么。

使用valgrind檢測(cè)內(nèi)存使用是否有問題:$ valgrind --tool=memcheck --leak-check=full ./mem

下面是截取的一些命令輸出片段:

==9763== Invalid read of size 1
==9763== at 0x407FD6E: vfprintf (vfprintf.c:1620)
==9763== by 0x408789F: printf (printf.c:35)
==9763== by 0x80485DC: main (mem.c:26)
==9763== Address 0x41a3068 is 0 bytes inside a block of size 128 free'd
==9763== at 0x4025BF0: free (vg_replace_malloc.c:366)
==9763== by 0x804857F: getUrl (mem.c:19)
==9763== by 0x80485AF: main (mem.c:25)

==9763== Invalid read of size 4
==9763== at 0x80485ED: main (mem.c:28)
==9763== Address 0x41a302c is 4 bytes inside a block of size 12 free
'd
==9763== at 0x4025BF0: free (vg_replace_malloc.c:366)
==9763== by 0x80485E8: main (mem.c:27)

==9763== HEAP SUMMARY:
==9763== in use at exit: 0 bytes in 0 blocks
==9763== total heap usage: 2 allocs, 2 frees, 140 bytes allocated
==9763==
==9763== All heap blocks were freed -- no leaks are possible
”Address 0x41a302c is 4 bytes inside a block of size 12 free'd“這句話翻譯過來大概就是說要訪問的地址0x41a302c已經(jīng)在被free掉的內(nèi)存塊中了。
”total heap usage: 2 allocs, 2 frees, 140bytes allocated“--line是128字節(jié),sizeof(structurl)=12,所以一共是140字節(jié),alloc了2次,free了2次,所以no leaks are possible。
我們把斷點(diǎn)設(shè)在16、20、28行,來看一下free之后,指針存儲(chǔ)的地址變了沒,通過該指針還能否訪問內(nèi)存。

為了使26行”合法“運(yùn)行,我們把19行注釋掉。這時(shí)用valgrind工具又會(huì)檢查出”可能“有內(nèi)存泄漏--事實(shí)上也確實(shí)是有內(nèi)存泄漏。

報(bào)告說alloc了2次,free了1次,可能在一個(gè)塊里面有128 bytes的內(nèi)存泄漏。
這line變量free也不是,不free也不是,腫么辦?
解決辦法:
 1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4
5 struct url{
6 char *domain;
7 char *path;
8 int depth;
9 };
10
11 void freeUrl(struct url* rect){
12 free(rect->domain);
13 free(rect->path);
14 free(rect);
15 }
16
17 void getUrl(struct url* rect){
18 char *line;
19 line=calloc(128,sizeof(char));
20 strcpy(line,"http://www.baidu.com /gaoji/preferences.html 2");
21 char *delim=" ";
22 char *d=calloc(40,sizeof(char));
23 char *p=calloc(80,sizeof(char));
24 strcpy(d,strtok(line,delim));
25 strcpy(p,strtok(NULL,delim));
26 rect->domain=d;
27 rect->path=p;
28 rect->depth=atoi(strtok(NULL,delim));
29 free(line);
30 }
31
32 main(){
33 struct url* rect;
34 rect=calloc(1,sizeof(struct url));
35 printf("%d\n",sizeof(struct url));
36 getUrl(rect);
37 printf("|%s|%s|%d|\n",rect->domain,rect->path,rect->depth);
38 freeUrl(rect);
39 }

valgrind沒有檢查出任何問題:



原文來自:博客園(華夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Linux C內(nèi)存泄露檢測(cè)工具
關(guān)于union和struct的內(nèi)存分配
C++中的內(nèi)存對(duì)齊
[B原創(chuàng)] Arm/x86結(jié)構(gòu)體gcc內(nèi)存邊界對(duì)齊問題
指向結(jié)構(gòu)體的指針
suningin詳解面試筆試題(11)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服