为啥我们要在 free() 释放内存后清空指针? [复制]

Posted

技术标签:

【中文标题】为啥我们要在 free() 释放内存后清空指针? [复制]【英文标题】:Why should we nullify pointer after freeing memory by free()? [duplicate]为什么我们要在 free() 释放内存后清空指针? [复制] 【发布时间】:2011-06-19 04:47:33 【问题描述】:

可能重复:Should one really set pointers to NULL after freeing them?

我已经使用 malloc 和 calloc 为指针分配了动态内存。使用此指针后,我应该释放内存,以便可以将块返回给操作系统(很好)。现在我的问题是,在释放块之后,我为什么要这样做:

pointer = NULL;

感谢您的帮助...

【问题讨论】:

Should one really set pointers to NULL after freeing them? 的可能副本。另请参阅:Setting variable to NULL after free 和 Is it always a good practice to set pointers to NULL after free()-ing them? 等。 很棒的链接......谢谢............ 【参考方案1】:

这样我们就不会留下悬空指针。如果不清空未使用的指针,您将无法在以后检测指针是否可以安全地取消引用或释放。并且尝试取消引用或释放悬空指针会导致未定义的行为(=崩溃)。

【讨论】:

只有运气好才会崩溃。最糟糕的是程序通常可以存活,但很难找到代码中的错误。 @ruslik,确实如此。尽管最终它会(几乎总是)崩溃。我只是想对 OP 做一个简单的解释 :-)【参考方案2】:

因为如果你再次尝试free() 它会出现Undefined Behaviour

另外,注意free-ing之后,内存被程序回收了。不是操作系统。内存在程序执行结束后由操作系统回收。

【讨论】:

【参考方案3】:

如果指针变量仍在作用域内,您以后无法确定它是否存储了有效地址,并且如果您尝试使用该指针,则会遇到未定义的行为。

free() 之后将指针设置为空是一种保护措施。如果您知道指针将在free() 之后很快超出范围,则不需要此操作:

if( ... ) 
    void* ptr;
    ptr = malloc( ... );
    //use the buffer;
    free( ptr );
    ptr = 0; //not actually needed

但与此同时,大多数编译器会看到,在这种情况下,将指针设置为 null 并没有明显的效果并优化该代码。

【讨论】:

【参考方案4】:

更好,因为:

首先,它使您的代码更简单。当你管理内存时,你会花很多时间在mallocfree 上。如果将其设置为 NULL,则可以执行以下操作:

int *pMyInteger;

/* in init code */

pMyInteger = (int *) malloc(42);

/* use pMyInteger */

free(pMyInteger);
pMyInteger = NULL;

/* somewhere else you have to change the size */

free(pMyInteger);
pMyInteger = (int *) malloc(42 * 10000);

真的很简单,不是吗?

其次,在调试器中发现 NULL (0) 指针也比发现悬空指针更容易。在调试器中看到0x0很容易猜到是指针管理问题。看到0xbac765就更难了:)

my2c

【讨论】:

以上是关于为啥我们要在 free() 释放内存后清空指针? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

free()的释放是何涵义,是把内容清空还是把指针置为NULL啊,还是其他啥啊。。求指点啊。。

为啥free函数不在释放内存后,将指针置NULL,野指针有啥用

为啥在使用 malloc() 和 free() 后,两个内存位置会发生变化?

C语言中free掉一段空间后为啥还要使用NULL

指针free后还存在吗?

在C语言进行编程中,为啥要释放旧内存?