亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C指針原理教程之垃圾回收-內存泄露

2020-01-26 13:32:28
字體:
來源:轉載
供稿:網友

一、內存泄露

1、正常的鏈表操作

下面程序建立一個10元素的鏈表,輸出它們的節點,每個節點是一個員工的工號和年齡。最后刪除每個節點,釋放列表。

dp@dp:~/memorytest % cat 1.c#include <stdlib.h>#include <stdio.h>//code:myhaspl@myhaspl.com//author:myhaspl//date:2014-01-10typedef struct listnode mynode; struct listnode{  mynode *next;  int number;  int age;  };mynode *addnode(mynode *prevnd,int number,int age){  mynode *ndtemp=(mynode*)malloc(sizeof(mynode));  prevnd->next=ndtemp;  ndtemp->number=number;  ndtemp->age=age;  ndtemp->next=NULL;  return ndtemp;}mynode *initlist(){  mynode *temp=(mynode*)malloc(sizeof(mynode));    temp->number=0;  temp->age=0;  temp->next=NULL;  return temp;}int main(){  mynode *mylist=initlist();  mynode *mytempnd=mylist;  int i=0;f懸掛指針  for(i=0;i<10;i++){    mytempnd=addnode(mytempnd,i,20+i);  }  //下面是正常的鏈表操作  //先輸出鏈表元素  for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){    printf("id:%d,age:%d/n",mytempnd->number,mytempnd->age);  }  //然后刪除鏈表中的所有元素  mynode* oldtmpnd;  for (mytempnd=mylist->next;mytempnd!=NULL;){    printf("delete id:%d/n",mytempnd->number);    oldtmpnd=mytempnd;    mytempnd=mytempnd->next;    free(oldtmpnd);  }  free(mylist);    return 0;  }

下面是程序運行效果

dp@dp:~/memorytest % gcc 1.c -o mytestdp@dp:~/memorytest % ./mytestid:0,age:20id:1,age:21id:2,age:22id:3,age:23id:4,age:24id:5,age:25id:6,age:26id:7,age:27id:8,age:28id:9,age:29delete id:0delete id:1delete id:2delete id:3delete id:4delete id:5delete id:6delete id:7delete id:8delete id:9dp@dp:~/memorytest % 

下面演示了垃圾的形成,這是內存泄露的一種方式,即在鏈表中,某些節點與鏈表中的其它節點失去聯系,導致無法刪除,下面故意讓第4個結點的next指針指向null,失去與后面6個元素的聯系。

dp@dp:~/memorytest % cat 1.c#include <stdlib.h>#include <stdio.h>//code:myhaspl@myhaspl.com//author:myhaspl//date:2014-01-10typedef struct listnode mynode; struct listnode{mynode *next;int number;int age;};mynode *addnode(mynode *prevnd,int number,int age){mynode *ndtemp=(mynode*)malloc(sizeof(mynode));prevnd->next=ndtemp;ndtemp->number=number;ndtemp->age=age;ndtemp->next=NULL;return ndtemp;}mynode *initlist(){mynode *temp=(mynode*)malloc(sizeof(mynode));temp->number=0;temp->age=0;temp->next=NULL;return temp;}int main(){mynode *mylist=initlist();mynode *mytempnd=mylist;int i=0;for(i=0;i<10;i++){mytempnd=addnode(mytempnd,i,20+i);}//下面是正常的鏈表操作//先輸出鏈表元素for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("id:%d,age:%d/n",mytempnd->number,mytempnd->age);}//然后刪除鏈表中的所有元素for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("delete id:%d/n",mytempnd->number);free(mytempnd);}free(mylist);//下面是形成內存泄露第一種情況-垃圾的演示//生成并輸出鏈表,這個與前面相同mylist=initlist();mytempnd=mylist;i=0;for(i=0;i<10;i++){mytempnd=addnode(mytempnd,i,20+i);}for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("id:%d,age:%d/n",mytempnd->number,mytempnd->age);}//刪除鏈表,我們故意留下后面6個鏈表節點無法刪除,導致后面6個鏈表節點形成垃圾int j=0;for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){if (++j>3){mytempnd->next=NULL;break;}}for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("delete id:%d/n",mytempnd->number);free(mytempnd);j++; }    return 0;}

下面是程序運行效果

dp@dp:~/memorytest % gcc 1.c -o mytestdp@dp:~/memorytest % ./mytestid:0,age:20id:1,age:21id:2,age:22id:3,age:23id:4,age:24id:5,age:25id:6,age:26id:7,age:27id:8,age:28id:9,age:29delete id:0delete id:1delete id:2delete id:3delete id:4delete id:5delete id:6delete id:7delete id:8delete id:9id:0,age:20id:1,age:21id:2,age:22id:3,age:23id:4,age:24id:5,age:25id:6,age:26id:7,age:27id:8,age:28id:9,age:29delete id:0delete id:1delete id:2delete id:3dp@dp:~/memorytest %

3、懸掛指針

一個指針不為空,但是指向一個無效的地址或耒知對象的地址,則這樣的指針稱為懸掛指針。

dp@dp:~/memorytest % cat 2.c#include <stdio.h>#include <stdlib.h>//code:myhaspl@myhaspl.com//author:myhaspl//date:2014-01-10typedef struct listnode mynode;struct listnode{mynode *next;int number;int age;};mynode *addnode(mynode *prevnd,int number,int age){mynode *ndtemp=(mynode*)malloc(sizeof(mynode));prevnd->next=ndtemp;ndtemp->number=number;ndtemp->age=age;ndtemp->next=NULL;return ndtemp;}mynode *initlist(){mynode *temp=(mynode*)malloc(sizeof(mynode));temp->number=0;temp->age=0;temp->next=NULL;return temp;}int main(){mynode *mylist=initlist();mynode *mytempnd=mylist;int i=0;for(i=0;i<10;i++){mytempnd=addnode(mytempnd,i,20+i);}//下面是正常的鏈表操作//先輸出鏈表元素for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("id:%d,age:%d/n",mytempnd->number,mytempnd->age);}//然后刪除鏈表中的所有元素mynode* oldtmpnd;for (mytempnd=mylist->next;mytempnd!=NULL;){printf("delete id:%d/n",mytempnd->number);oldtmpnd=mytempnd;mytempnd=mytempnd->next;free(oldtmpnd);}free(mylist);//下面是形成內存泄露第二種情況-懸掛指針的演示//生成并輸出鏈表,這個與前面相同mylist=initlist();mytempnd=mylist;i=0;for(i=0;i<10;i++){mytempnd=addnode(mytempnd,i,20+i);}for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("id:%d,age:%d/n",mytempnd->number,mytempnd->age);}//我們故意刪除鏈表后面的4個節點,但是讓第6個元素的next指向的地址無效,//仍指向已經刪除的第7個節點,導致懸掛指針printf ("-------------------------/n");int j=0;for (mytempnd=mylist->next;mytempnd!=NULL;){oldtmpnd=mytempnd;mytempnd=mytempnd->next;if (++j>6){printf("delete id:%d/n",oldtmpnd->number);free(oldtmpnd);}}    return 0;}

執行程序

dp@dp:~/memorytest % gcc 2.c -o mytestdp@dp:~/memorytest % ./mytestid:0,age:20id:1,age:21id:2,age:22id:3,age:23id:4,age:24id:5,age:25id:6,age:26id:7,age:27id:8,age:28id:9,age:29delete id:0delete id:1delete id:2delete id:3delete id:4delete id:5delete id:6delete id:7delete id:8delete id:9id:0,age:20id:1,age:21id:2,age:22id:3,age:23id:4,age:24id:5,age:25id:6,age:26id:7,age:27id:8,age:28id:9,age:29delete id:6delete id:7delete id:8delete id:9

但是注意free函數表示釋放,這個釋放指的是把這段內存標記成可用狀態,或者說,沒有人在用這段內存了,也就是意味著如果這段內存如果沒有被操作系統重新使用,里面的數據還存在,如果被操作系統分配給其它程序或本程序的其它內存塊申請之用,則數據會被清空。

3、下面是形成內存泄露第三種情況-共享的演示,多個指針指向同一個內存,這個內存因為某個指針不再使用的原因刪除,導致其它指針指向一個無效地址

dp@dp:~/memorytest % cat 2.c#include <stdio.h>#include <stdlib.h>//code:myhaspl@myhaspl.com//author:myhaspl//date:2014-01-10typedef struct listnode mynode;struct listnode{mynode *next;char *data;int number;int age;};mynode *addnode(mynode *prevnd,int number,int age,char *data){mynode *ndtemp=(mynode*)malloc(sizeof(mynode));prevnd->next=ndtemp;ndtemp->number=number;ndtemp->age=age;ndtemp->data=data;ndtemp->next=NULL;return ndtemp;}mynode *initlist(){mynode *temp=(mynode*)malloc(sizeof(mynode));temp->number=0;temp->age=0;temp->data=NULL;temp->next=NULL;return temp;}int main(){    //下面是形成內存泄露第三種情況-共享的演示,多個指針指向同一個內存,這個內存因為某個指針不再使用的原因刪除,//生成并輸出鏈表,生成1個鏈表(共3個元素),元素的data都指向同一個內存塊mynode *mylist=initlist();mynode *mytempnd=mylist;char *mydata=(char *)malloc(100);const char *strsrc="helloworld";strcpy(mydata,strsrc);int i=0;for(i=0;i<3;i++){    mytempnd=addnode(mytempnd,i,20+i,mydata);}for (mytempnd=mylist->next;mytempnd!=NULL;mytempnd=mytempnd->next){printf("id:%d,age:%d,data:%s/n",mytempnd->number,mytempnd->age,mytempnd->data);    }//下面將導致共享的內存釋放,但仍有2個結點指向這個內存,這將導致內存泄露//我們故意刪除最后一個節點,并釋放最后一個結點的data指針指向的內存printf ("-------------------------/n");mynode *oldtmpnd;for (mytempnd=mylist->next;mytempnd!=NULL;){oldtmpnd=mytempnd;mytempnd=mytempnd->next;if (mytempnd==NULL){printf("delete id:%d/n",oldtmpnd->number);free(oldtmpnd->data);free(oldtmpnd);}}    return 0;}

執行程序:

dp@dp:~/memorytest % gcc 2.c -o mytest2.c: In function 'main':2.c:37: warning: incompatible implicit declaration of built-in function 'strcpy'dp@dp:~/memorytest % ./mytestid:0,age:20,data:helloworldid:1,age:21,data:helloworldid:2,age:22,data:helloworlddelete id:2dp@dp:~/memorytest % 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人a级网| 国产自产女人91一区在线观看| 亚洲国产成人av在线| 国产精品99久久久久久白浆小说| 日韩a**中文字幕| 亚洲va欧美va国产综合久久| 九九九久久国产免费| 国产精品视频最多的网站| 日韩美女福利视频| 黄色成人av网| 亚洲男人天堂网站| 欧美性感美女h网站在线观看免费| 日韩美女av在线免费观看| 国产亚洲欧洲黄色| 91视频国产精品| 国产精品27p| 最近日韩中文字幕中文| 久久久999国产| 久久男人av资源网站| 国内精品久久久久久影视8| 国产成人精品日本亚洲专区61| 日本免费一区二区三区视频观看| 亚洲乱码一区二区| 91久久夜色精品国产网站| 青草青草久热精品视频在线观看| 国产精品丝袜视频| 亚洲欧洲国产一区| 欧洲日本亚洲国产区| 亚洲一二三在线| 国产精品视频一区国模私拍| 日本最新高清不卡中文字幕| 国产精品免费小视频| 国产精品一区二区电影| 国产视频久久久久| 91精品国产91久久久久久久久| 国模吧一区二区三区| 日韩在线免费av| 久久精品免费播放| 亚洲天堂av在线免费观看| 在线一区二区日韩| 久久久中精品2020中文| 91欧美视频网站| 国产精品99久久久久久人| 精品欧美国产一区二区三区| 日韩有码视频在线| 欧美做爰性生交视频| 中文日韩在线观看| 亚洲另类激情图| 亚洲精品日韩丝袜精品| 日韩欧美国产成人| 日韩网站免费观看高清| 国产91色在线播放| 国产精品三级久久久久久电影| 国产精品露脸av在线| 97在线观看视频| 亚洲精品一区在线观看香蕉| 不卡av在线播放| 91精品国产一区| 久久久久久久久久婷婷| 亚洲精品电影在线| 亚洲japanese制服美女| 一区二区三区视频免费| 亚洲天堂av在线免费| 久久久久久久一区二区| 欧美性猛交xxxx免费看| 欧美色道久久88综合亚洲精品| 91极品视频在线| 狠狠躁夜夜躁人人躁婷婷91| 日韩av在线免费播放| 亚洲一区久久久| 乱亲女秽乱长久久久| 亚洲成年人在线| 97超碰色婷婷| 亚洲欧美中文字幕| 欧美国产视频一区二区| 日本高清不卡的在线| 国产精品一区二区女厕厕| 欧美日韩xxxxx| 欧美激情久久久| 国产成人涩涩涩视频在线观看| 亚洲电影中文字幕| 久久青草福利网站| 欧美综合在线观看| 欧美日韩精品在线视频| 亚洲美女免费精品视频在线观看| 久久免费观看视频| 国产综合久久久久| 91香蕉电影院| 国产精品久久久久免费a∨| 成人黄色大片在线免费观看| 欧美人成在线视频| 日韩网站免费观看高清| 亚洲男女自偷自拍图片另类| 国产精品三级久久久久久电影| 国产精品黄色影片导航在线观看| 中文字幕精品国产| 亚洲一区美女视频在线观看免费| 日韩国产高清污视频在线观看| 久久视频免费在线播放| 成人高清视频观看www| 久久亚洲精品一区二区| 主播福利视频一区| 日本精品视频在线观看| 日韩精品中文字幕在线播放| 亚洲xxx自由成熟| 国产精品福利网| 色婷婷综合久久久久中文字幕1| 97精品视频在线观看| 欧美精品videosex牲欧美| 欧美日韩成人精品| 狠狠色狠狠色综合日日小说| 91极品视频在线| 永久免费毛片在线播放不卡| 欧美日韩国产精品专区| 九九热精品视频在线播放| 成人av色在线观看| 羞羞色国产精品| 欧美激情二区三区| 国产成人在线一区二区| 色先锋资源久久综合5566| 国产成人精品免费视频| 国产97色在线|日韩| 日韩av在线影院| 亚洲女人天堂av| 久久久视频免费观看| 91人人爽人人爽人人精88v| 亚洲风情亚aⅴ在线发布| 亚洲精品99999| 中文字幕精品在线视频| 国产亚洲精品久久久优势| 国产午夜一区二区| 亚洲欧美在线第一页| 美日韩在线视频| 日韩免费电影在线观看| 精品国产一区二区三区久久久狼| 欧美俄罗斯乱妇| www.xxxx精品| 亚洲天堂精品在线| 日本午夜精品理论片a级appf发布| 911国产网站尤物在线观看| 午夜免费在线观看精品视频| 97久久伊人激情网| 日韩av在线直播| 亚洲三级免费看| 亚洲国产精品国自产拍av秋霞| 日韩在线观看电影| 国产成人在线亚洲欧美| 色婷婷亚洲mv天堂mv在影片| 51色欧美片视频在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 韩国精品久久久999| 久久亚洲精品中文字幕冲田杏梨| 欧美日韩中国免费专区在线看| 久久免费成人精品视频| 亚洲性日韩精品一区二区| 97超视频免费观看| 久久免费在线观看| 精品久久久久久电影| 久久久视频在线| 久久九九热免费视频| 伊人男人综合视频网| 北条麻妃一区二区三区中文字幕| 国产一区二区三区精品久久久| 久久在线观看视频|