可能重复:
Should one really set pointers toNULL
after freeing them?
我已经使用malloc和calloc为指针分配了动态内存。使用此指针后,我应该释放内存,以便可以将块返回到OS(很好)。现在我的问题是,在释放块之后,我为什么要这样做:
pointer = NULL;
感谢您的帮助...
答案 0 :(得分:8)
这样我们就不会留下悬空指针。如果不归零未使用的指针,则无法在以后检测指针是否可以安全地解除引用或释放。并且尝试取消引用或释放悬空指针会导致未定义的行为(=崩溃)。
答案 1 :(得分:3)
因为如果您再次尝试free()
,Undefined Behaviour
将会发生。{/ p>
另请注意,在free
之后,程序将回收内存。不是操作系统。在程序执行结束后,操作系统将回收内存。
答案 2 :(得分:2)
如果指针变量仍在范围内,则以后无法确定它是否存储有效地址,如果您尝试使用该指针,则会遇到未定义的行为。
在free()
之后将指针设置为null是一种保护措施。如果您知道指针在free()
之后很快就会超出范围,则不需要这样做:
if( ... ) {
void* ptr;
ptr = malloc( ... );
//use the buffer;
free( ptr );
ptr = 0; //not actually needed
}
但与此同时,大多数编译器都会看到在这种情况下设置指向null的指针没有可观察到的影响,并优化了该代码。
答案 3 :(得分:0)
更好,因为:
首先,它使您的代码更简单。管理内存时,您需要花费大量时间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