2011-02-01 83 views
2

可能重复:
Should one really set pointers to NULL after freeing them?为什么我们应该在free()释放内存之后使指针无效?

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

pointer = NULL; 

感谢您的帮助......

+4

可能重复如若一个人真正集指向`NULL`后解放他们?](http://stackoverflow.com/questions/1879550/should-one-really-set-pointers-to-null-after-freeing-them)。另请参阅:[将变量设置为NULL后免费](http://stackoverflow.com/questions/1025589/setting-variable-to-null-after-free)和[是否总是一个很好的做法,将指针设置为NULL后免费() - 他们?](http://stackoverflow.com/questions/3365772/is-it-always-a-good-practice-to-set-pointers-to-null-after-free-ing-them )等等。 – 2011-02-01 10:59:09

+0

伟大的链接.....谢谢......... – Muse 2011-02-01 11:06:22

回答

8

让我们不要离开悬挂指针落后。如果不清空未使用的指针,以后无法检测指针是否可以安全地取消引用或释放。并且试图解引用或释放悬挂指针导致未定义的行为(= crash)。

3

因为如果你尝试free()再次Undefined Behaviour会发生。

此外,请注意,在free -ing之后,程序将回收内存。而不是操作系统。在程序执行结束后,内存由OS回收。

2

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

free()是一个保护措施后,将指针设置为空。你不需要这个,如果你知道指针会超出范围后不久free()

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

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

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)指针比在悬挂的指针中更容易。它很容易猜测,有一个指针管理问题,当你在你看到0xbac765的debugger.When看到0​​,它很难:)

MY2C

的[
相关问题