我们为什么要在free()释放内存后使指针无效?

时间:2011-02-01 10:54:23

标签: c pointers null

  

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

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

pointer = NULL;

感谢您的帮助...

4 个答案:

答案 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)

更好,因为:

首先,它使您的代码更简单。管理内存时,您需要花费大量时间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