Chinaunix

标题: 关于链表释放内存问题~~~~~~~~~~~~~~~~~~ [打印本页]

作者: 七夜未央    时间: 2013-02-19 15:08
标题: 关于链表释放内存问题~~~~~~~~~~~~~~~~~~
假设我现在已经有一个链表,现在要对这个链表中的内存进行释放,那应该是逐次delete掉链表中的节点就可以了吧,代码如下:
  1. Spoint *pDelete = NULL;
  2. pHead = process(vecData);// 创建链表
  3. showPoint(pHead);// 打印链表
  4. while(pHead) // 释放
  5. {
  6.         pDelete = pHead;
  7.         pHead = pHead->next;
  8.         delete pDelete;
  9. }
复制代码
这样释放有问题吗?如果没问题的话我单步调试了一下,有些不解的地方
(gdb)
1001 aaa
1002 bbb
1004 ddd
1005 eee
special:1005
258                     while(pHead)
(gdb)
260                             pDelete = pHead;
(gdb)
261                       pHead = pHead->next;
(gdb)
262                       delete pDelete;
(gdb)
258                     while(pHead)
(gdb)
260                             pDelete = pHead;
(gdb)
261                       pHead = pHead->next;
(gdb) p *pDelete
$1 = {id = 1002, name = "bbb\000\000\000\000\000\000", next = 0x609380, father = 0x609500, brother = 0x609400, special = 0x0} ——这是第二个节点
(gdb) p *pDelete->father
$4 = {id = 0, name = "\000\000\000\000\000\000\000\000\000", next = 0x609480, father = 0x0, brother = 0x0, special = 0x0} 就是这里有点疑问,按道理我已经将第一个节点释放掉了啊,为什么还可以通过father地址访问到第一个节点呢?我的理解是如果delete掉的东西在内存中的信息应该已经完全被擦空了啊,这是怎么回事呢?
作者: linux_c_py_php    时间: 2013-02-19 15:14
指针存地址, 地址就是一个整形, 并且地址指向的内存也没人重用, 所以你可以通过指针访问, 并且访问的内容还是老的内容.
作者: captivated    时间: 2013-02-19 15:34

额 LZ貌似老鸟了啊,怎么对这个问题还有疑问
作者: 七夜未央    时间: 2013-02-19 15:58
captivated 发表于 2013-02-19 15:34
额 LZ貌似老鸟了啊,怎么对这个问题还有疑问


跟你比起来我还小的很呢,指针木有搞透啊
作者: littledick    时间: 2013-02-19 16:14
卖萌可耻{:3_183:}
作者: lin5161678    时间: 2013-02-19 17:48
释放内存和内存置0是两回事
作者: freshxman    时间: 2013-02-19 18:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: a1557664246    时间: 2013-02-19 22:03
新人学习下。
作者: FaintKnowledge    时间: 2013-02-20 00:16
回复 1# 七夜未央

你释放的应该是指针指向的地址
这样:
char a[10]=............
*p = a;
*d = a;
然后:
*p=NULL
你猜*d是什么




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2