设为首页 加入收藏

TOP

C指针原理(49)-垃圾回收-内存泄露
2014-11-23 20:16:19 来源: 作者: 【 】 浏览:14
Tags:指针 原理 垃圾 回收 内存 泄露

3、下面是形成内存泄露第三种情况-共享的演示,多个指针指向同一个内存,这个内存因为某个指针不再使用的原因删除,导致其它指针指向一个无效地址

dp@dp:~/memorytest % cat 2.c

#include

#include

//code:myhaspl@myhaspl.com

//author:myhaspl

//date:2014-01-10

typedef 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;

}

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/

执行程序:

dp@dp:~/memorytest % gcc 2.c -o mytest

2.c: In function 'main':

2.c:37: warning: incompatible implicit declaration of built-in function 'strcpy'

dp@dp:~/memorytest % ./mytest

id:0,age:20,data:helloworld

id:1,age:21,data:helloworld

id:2,age:22,data:helloworld

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

delete id:2

dp@dp:~/memorytest %

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C指针原理(48)-垃圾回收-内存泄.. 下一篇神奇的C语言

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: