C语言中再次释放已经释放的空间会造成什么后果?

如题所述

free再次释放已释放的空间,不会有任何释放效果,因为free释放地址,是对地址作标记,表示该地址未被使用,可以再次用于分配。并不是说内存就消失了。

(注意:1,free后原内存中的数据,不变或被重置。2,free后不会自动将指针置NULL,需要手动置NULL,继续用指针访问已释放的地址是不安全的。)

下面演示代码(正常不要这么写!!!)

#include <stdio.h>

#include <malloc.h>

int main()

{

    int *p=NULL;

    p=(int *)malloc(sizeof(int));

    *p=123;

    printf("p初值:%d\n",*p);

    free(p);

    printf("第一次释放后!\n");

    printf("p=%d\n",*p);

    printf("指针未置NULL的情况下,再次给指针指向地址赋值123后:\n");

    *p=123;

    printf("p再次赋值%d\n",*p);

    free(p);

    printf("再次释放后\n");

    printf("p=%d\n",*p);

    return 0;

}

温馨提示:内容为网友见解,仅供参考
无其他回答

C语言中再次释放已经释放的空间会造成什么后果?
free再次释放已释放的空间,不会有任何释放效果,因为free释放地址,是对地址作标记,表示该地址未被使用,可以再次用于分配。并不是说内存就消失了。(注意:1,free后原内存中的数据,不变或被重置。2,free后不会自动将指针置NULL,需要手动置NULL,继续用指针访问已释放的地址是不安全的。)下面演示...

C语言中堆空间在释放时可能发生的错误有哪些
未释放之前在堆上申请的空间,造成内存泄露 比如上面q,如果程序中没有对其内存free,就会出现内存泄露 上面的两个是基本的错误,另外还可能在程序的逻辑上出现错误,比如多个指针都指向同一片内存空间,并对其释放了多次。那么除了第一次释放以外,其它都是错误的。char *q = (char*) malloc(sizeof(c...

C语言问题
现在的编译器,在free释放内存后,断开了代码对那段内在空间的控制权,告诉系统那块内存可以重新分配了,但并不切断指针p对那块内存的指向,通过*p仍能读出来正确的值来(在那块内存被再分配前读)——这大概也是一些大家要求free后要给被free的指针赋NULL的原因。一个指针变量有三种状态:一是正常状态,...

关于c语言中free函数的一些疑问
你不能在函数里面释放空间,因为你申请空间的目的就是反回给主函数中的P,如果你一申请就又在函数里释放了,那和没申请没有什么区别,所以你在主函数中P也就无法再调用那一片空间了.

C语言里 free释放的是什么,释放的是不是对内存空间的使用权,释放后内存...
理解正确,释放后的值当然还在那个位置,只是你再没有指针去指向它,也就无法操作它了。很多编译器中,如果对于刚刚free的内存,重新再访问,会发现里面的值没有发生变化。

在C语言进行编程中,为什么要释放旧内存?
即是说C\/C++ 都需要主动释放动态申请的内存。试着解释下为什么要主动释放动态申请的内存:1.动态申请的内存,存储在堆中,编译器不会自己回收,回收的意义:通俗讲就是告诉编译器,这片内存可以使用。如果不被回收,这片内存就永远都不会被重新利用。也就是内存泄露。例如 int *a=(int *)malloc (...

看C语言的书中说“释放存储空间”,是什么意思?什么叫做释放,为什么叫...
就是通知操作系统,先前申请的指定部分的变量所使用的空间不再使用,使用权交还给操作系统,以便分配给其它程序使用。dispose(p)就是将变量p所代表的空间还给操作系统的意思(原本是向操作系统申请由本程序使用的,操作系统不会再分给别的程序使用)。

C语言free释放内存后为什么指针里的值不变?竟然还可以输出
看来你并未弄清楚“释放”的意思。释放是说把“原来指针指向的内存空间交还给系统”,由系统重新支配——因为用malloc分配后那部分内存就由你的代码支配而系统支配不了了。那么free后,尽管交还了系统,但还在系统没有重新使用这块内存时,它里面的数据没有改变,你当然可以读出来——因为内存中的数据无...

c语言中free函数释放内存后,该内存的里边的数据还有吗?
2.对于释放后内存中的数据数量,我们只能认为是脏数据;换句话说,这部分数据可能存在并保持原始值,也可能被清空或修改为其他值;这表明有许多可能的情况下,因此,内存被释放后,除了分配指针赋值的空,也要小心不要参考这部分的内存,不要试图得到这部分的价值,这些已经是非法的。

C语言中malloc分配内存空间不足, 但是还是能放,为什么呢?
这说明你比较幸运,没有出现程序崩溃。首先在堆栈申请的内存,后面也许还是没有别的程序在用,所以你的程序超过你申请的内存也不会出现问题;但是如果有别的程序已经占用了你申请内存的后面空间,你再用就会出现无法写入,程序崩溃。

相似回答