2 lmikic Lmikic 于 2016.02.22 16:39 提问

指针p和指针q同时指向一条链表h时free函数释放空间

大家好:
对于free()释放空间有个疑问:指针p和指针q同时指向一条链表h,即p=q=h,这时free(p),整条链被释放了吗?目前我的认识水平是这样的,free(p)后,就是告诉系统p所在的空间被释放了,系统可以再次利用这部分空间,虽然这部分空间的内容没有被破坏掉,还是可以用h和q来访问。但是若有其他申请空间的操作,这部分空间岂不是有被破坏的可能?
还望您能够批评指正!

1个回答

caozhy
caozhy   Ds   Rxr 2016.02.23 07:36
已采纳

释放的是内存,所以你有多个指针指向这个地址,那么它们同时失效了。虽然语法上可以用p q h访问,但是这样的结果是不可预测的。
如果是链表,只有这个节点被释放,它指向next指针的不会释放,如果释放了头节点,没有指针指向后继节点,那么再也没法释放它们,这就导致内存泄漏了。

Lmikic
Lmikic 非常感谢您的回答,受益匪浅。关于“链表中next指针的不会释放“这点我不太明白,能否再具体讲讲?我想到了这种情况,比如 h 指向一条链的头,p 和 q 指向这条链中间的某个不同地方,这时候释放 h,对 p q 有什么影响呢?
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
释放掉指针P所指向的内存空间,继续读取指针P的值会报什么错
这是在学习指针的时候遇到的一个小问题: 释放掉指针P所指向的内存空间,继续读取指针P的值会报什么错,直接贴代码 int mainsingle() { int *p = new int; *p = 3; cout <<"将3赋给p的地址后,指针p中保存的地址:\t"<<p<<endl;//004E4F20 cout <<"将3赋给p的地址后,指针p读取的值:
数组内存申请和释放,指针数组和数组指针
一 数组指针的空间释放 1 2 3 4 int (*p)[3] = new int [4][3]; // ... delete []p;    //---1 delete[](*p);  //---2 在释放这个二维数组时,应该使用1和2哪种方式呢?哪种对呢?
指针空间的申请和释放
一、malloc()和free()的基本概念以及基本用法: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该有多种,比如说空间不足就是一种。 char *Ptr = NULL; Ptr = (char *)malloc(100 *
有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。
问题:有一个单项的链表,在没有头结点的情况下,只知道有一个指向结点B的指针p,假设这个结点B不是尾结点,删除该节点B。 p->data = p->next->data; p->next = p->next->next; free(p->next)解析:要删除p指向的结点B,必须要将结点B前后的两个节点A和C连接起来,但是该单链表没有头结点,因此无法追溯到A,也就无法将A和C相连
指针与动态空间分配
转载自http://blog.csdn.net/tsinfeng/article/details/5686816
C语言中free函数如何确定释放的空间大小
在前几天被人问到:malloc函数开辟空间返回地址的前两个字节的作用?   当被问到这个问题时,我开始回忆平时如何使用malloc.由于平时在windows下使用malloc或者new进行堆内存开辟时,发现在对多于开辟空间的地址赋值,再进行调用free或者delete时,系统会崩溃,因此,我跟他说,在malloc开辟指定长度的空间后面有部分空间用于进行校验.   今天写代码进行测试,测试代码如
free(p)后指针问题
笔试很喜欢考这些 #include #include #include int main(){  char *str = (char *)malloc(100);  strcpy(str, "hello");  free(str);  if(str != NULL)    {      strcpy(str, "world");      printf("%s/n", str);    }    
在一个无头指针的单链表中,删除指针p所指向的结点
1,算法描述:在无头单链表中,删除指针p所指向的结点       注意:是没有头结点的。       算法思想:我们无法得到p所指结点的前驱,但是其后继是知道的,当前结点和后继结点的区别是data的不同,我们可以将p所指向结点的后继的值赋给p所指向的结点,将p所指向结点的后继删除,将该后继的后继地址赋给p的next。即       q=p->next;       p->data=q->d
写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放
#include #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; void free(char *p) { if(p>=newbuf&&p<newbuf+NEWSIZE) { newp=p; } }
free之后要记得指针置空
别看 free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。     用调试器跟踪示例程序,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。     如果程序比较长,我们有时记不住p 所指的内存是否已经被释