C指针原理(48)-垃圾回收-内存泄露
2014-01-11 11:34
288 查看
3、悬挂指针
一个指针不为空,但是指向一个无效的地址或耒知对象的地址,则这样的指针称为悬挂指针。
dp@dp:~/memorytest % cat 2.c
执行程序
dp@dp:~/memorytest % gcc 2.c -o mytest
dp@dp:~/memorytest % ./mytest
id:0,age:20
id:1,age:21
id:2,age:22
id:3,age:23
id:4,age:24
id:5,age:25
id:6,age:26
id:7,age:27
id:8,age:28
id:9,age:29
delete id:0
delete id:1
delete id:2
delete id:3
delete id:4
delete id:5
delete id:6
delete id:7
delete id:8
delete id:9
id:0,age:20
id:1,age:21
id:2,age:22
id:3,age:23
id:4,age:24
id:5,age:25
id:6,age:26
id:7,age:27
id:8,age:28
id:9,age:29
-------------------------
delete id:6
delete id:7
delete id:8
delete id:9
但是注意free函数表示释放,这个释放指的是把这段内存标记成可用状态,或者说,没有人在用这段内存了,也就是意味着如果这段内存如果没有被操作系统重新使用,里面的数据还存在,如果被操作系统分配给其它程序或本程序的其它内存块申请之用,则数据会被清空。
一个指针不为空,但是指向一个无效的地址或耒知对象的地址,则这样的指针称为悬挂指针。
dp@dp:~/memorytest % cat 2.c
#include <stdio.h> #include <stdlib.h> //code:myhaspl@myhaspl.com //author:myhaspl //date:2014-01-10 typedef 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; }
麦好的AI乐园博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/myhaspl/
执行程序dp@dp:~/memorytest % gcc 2.c -o mytest
dp@dp:~/memorytest % ./mytest
id:0,age:20
id:1,age:21
id:2,age:22
id:3,age:23
id:4,age:24
id:5,age:25
id:6,age:26
id:7,age:27
id:8,age:28
id:9,age:29
delete id:0
delete id:1
delete id:2
delete id:3
delete id:4
delete id:5
delete id:6
delete id:7
delete id:8
delete id:9
id:0,age:20
id:1,age:21
id:2,age:22
id:3,age:23
id:4,age:24
id:5,age:25
id:6,age:26
id:7,age:27
id:8,age:28
id:9,age:29
-------------------------
delete id:6
delete id:7
delete id:8
delete id:9
但是注意free函数表示释放,这个释放指的是把这段内存标记成可用状态,或者说,没有人在用这段内存了,也就是意味着如果这段内存如果没有被操作系统重新使用,里面的数据还存在,如果被操作系统分配给其它程序或本程序的其它内存块申请之用,则数据会被清空。
相关文章推荐
- 【Java面试整理之JVM】深入理解JVM结构、类加载机制、垃圾回收GC原理、JVM内存分配策略、JVM内存泄露和溢出
- [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露
- JavaScript垃圾回收与内存泄露
- JAVA垃圾回收机制与内存泄露问题
- C指针原理(49)-垃圾回收-内存泄露
- Java垃圾回收机制与内存泄露问题
- 简析Android的垃圾回收与内存泄露
- 学习总结--内存泄露和垃圾回收
- PHP的内存泄露问题与垃圾回收
- 闭包,作用域链,垃圾回收,内存泄露
- PHP的内存泄露问题与垃圾回收
- JavaScript 的垃圾回收与内存泄露
- Java中内存泄露及垃圾回收机制
- JavaScript 的垃圾回收与内存泄露
- Flex的垃圾回收机理及预防内存泄露
- java垃圾回收机制和内存泄露
- Flex的垃圾回收机理及预防内存泄露
- Java基础之垃圾回收机制以及内存泄露
- JAVA 内存管理总结:内存泄露、数据存储、垃圾回收机制一网打尽!
- 我理解的AS3的内存泄露与垃圾回收