为啥我们要在 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 toNULL
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】:更好,因为:
首先,它使您的代码更简单。当你管理内存时,你会花很多时间在malloc
和free
上。如果将其设置为 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,野指针有啥用