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 %