可能重复:
Should one really set pointers toNULL
after freeing them?为什么我们应该在free()释放内存之后使指针无效?
我已经分配的动态内存使用malloc和释放calloc的指针。使用这个指针后,我应该释放内存,以便块可以返回到操作系统(它很好)。我现在的问题是,释放块之后,为什么要我做这样的事情:
pointer = NULL;
感谢您的帮助......
可能重复:
Should one really set pointers toNULL
after freeing them?为什么我们应该在free()释放内存之后使指针无效?
我已经分配的动态内存使用malloc和释放calloc的指针。使用这个指针后,我应该释放内存,以便块可以返回到操作系统(它很好)。我现在的问题是,释放块之后,为什么要我做这样的事情:
pointer = NULL;
感谢您的帮助......
让我们不要离开悬挂指针落后。如果不清空未使用的指针,以后无法检测指针是否可以安全地取消引用或释放。并且试图解引用或释放悬挂指针导致未定义的行为(= crash)。
因为如果你尝试free()
再次Undefined Behaviour
会发生。
此外,请注意,在free
-ing之后,程序将回收内存。而不是操作系统。在程序执行结束后,内存由OS回收。
如果指针变量保留在作用域中,您以后无法找到它是否存储有效地址,如果尝试使用该指针,则会遇到未定义的行为。
free()
是一个保护措施后,将指针设置为空。你不需要这个,如果你知道指针会超出范围后不久free()
:
if(...) {
void* ptr;
ptr = malloc(...);
//use the buffer;
free(ptr);
ptr = 0; //not actually needed
}
但同时大多数编译器会看到,在这种情况下指针设置为NULL,则没有明显的效果并优化代码。
这是因为:
首先,它使您的代码更简单。当你管理内存时,你会花费很多时间去做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)指针比在悬挂的指针中更容易。它很容易猜测,有一个指针管理问题,当你在你看到0xbac765
的debugger.When看到0,它很难:)
MY2C
的[
可能重复如若一个人真正集指向`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
伟大的链接.....谢谢......... – Muse 2011-02-01 11:06:22