释放指针并将其指定为NULL有什么区别?
有人能告诉我两者之间的区别:
int *p; p=(int*)malloc(10*sizeof(int)); free(p);
要么
int *p; p=(int*)malloc(10*sizeof(int)); p=NULL;
free
将释放p
指向的内存 – 简单地将其分配给NULL
将不会(因此您将有内存泄漏)。
值得一提的是,在调用free
之后将指针指向NULL
是一个好习惯,因为这样可以防止你意外地尝试访问释放的内存(这仍然是可能的,但绝对不应该这样做)。
C中没有垃圾收集,所以如果你没有显式释放一块内存,它就永远不会被释放,即使它没有引用它。 也许你来自垃圾收集语言的背景,所以可能很难改变你的想法,但记住“手动”释放像C这样的低级语言中的所有资源总是很重要的。
希望这有助于干杯
p是指针(在内存中动态分配的块[在堆上“]”)
这意味着p是一个变量,它包含特定块的内存中的地址 (或某个特定的大小,在示例中是一个足以容纳10个整数的块)。
free(p);
指示存储器管理逻辑(C运行时),p指向的块先前占用的存储器可以被重用。
p = NULL;
将p的值设置为NULL(以前包含的地址丢失)但是它指向的内存块仍然被认为是在使用中。
可能存在一些混淆,因为在诸如Java,C#,Python等语言中仅仅将变量分配给NULL(或者将该变量分配给另一个地址),将自动释放底层内存(假设其他内容中不存在对此地址的其他引用)实时变量)。
在C或C ++中不是这种情况,导致如下错误:
free(p); // possibly some some code etc. // later: p[6] = 'a'; // <<--- Ouch we're modifying whatever new variable is there !!!
要么
// didn't call free(p) p = NULL; // now the memory allocated for p is held in memory even though it // is not going to be used (assuming no copies of p or of pointers to part // of that block were made.
后一种情况只是浪费资源,前者可能导致难以发现的错误。
这就是为什么典型的C语言是:
free(p); p = NULL;
不调用free并直接分配给NULL将导致内存泄漏,正如其他人所解释的那样。 您可以参考此链接以获取有关内存泄漏和其他内存相关问题的明确详细信息。
释放已分配的内存会释放它并允许在其他地方使用该内存,同时保留指向内存分配位置的指针。
将指向已分配内存的指针设置为NULL不会释放它。
如果您正在使用使用基于堆的malloc的实现,请调试分配,使用和释放内存的内容,并对分配,使用和将指向内存的指针设置为NULL的内容执行相同的操作。
内存管理依赖于实现(请参阅http://en.wikipedia.org/wiki/Malloc#Implementations )。
1。
int *p; p= (int * ) malloc(10*sizeof(int)); free(p);
内存被释放回堆中。 但指针仍然指向释放的内存位置。 因此,如果进一步使用,将导致内存损坏 。
因此,正确的做法是将指针显式重置为NULL,以避免进一步使用该指针。
不建议在C中键入转换返回指针
2。
int *p; p=(int * )malloc(10*sizeof(int)); p=NULL;
这会导致内存泄漏 :因为此处未释放分配的内存。 你只是将指针重置为NULL。
更好的方法是首先释放内存然后将其设置为NULL:
free(p); p = NULL;
p=NULL
不释放内存。 如果你不再需要使用p
指向的内存,你应该使用free()
否则会出现内存泄漏。 您还应该在调用free()
之后设置p=NULL
,以避免将来再次错误地访问该内存。