释放指针并将其指定为NULL有什么区别?

时间:2010-03-12 06:00:13

标签: c pointers free

有人可以告诉我区别:

int *p;
p=(int*)malloc(10*sizeof(int));
free(p);

int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;

8 个答案:

答案 0 :(得分:39)

free将释放p指向的内存 - 只需将其分配给NULL就不会(因此会有内存泄漏)。

值得一提的是,最好在调用NULL之后将指针指向free,因为这样可以防止您意外尝试访问释放的内存(这仍然是可能的) ,但绝对不应该这样做。)

答案 1 :(得分:9)

C中没有垃圾收集,所以如果你没有显式释放一块内存,它就永远不会被释放,即使没有引用它。也许你来自垃圾收集语言的背景,因此可能很难改变你的想法,但记住“手动”释放像C这样的低级语言中的所有资源总是很重要。

希望这会有所帮助 干杯

答案 2 :(得分:7)

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;

答案 3 :(得分:2)

不调用free并直接分配给NULL将导致内存泄漏,正如其他人所解释的那样。您可以参考此link以获取有关内存泄漏和其他内存相关问题的详细信息。

答案 4 :(得分:2)

更好的方法是首先释放内存,然后将其设置为NULL:

free(p);
p = NULL;

答案 5 :(得分:1)

释放已分配的内存会释放它并允许在其他地方使用该内存,同时保留指向内存分配位置的指针。

将指向已分配内存的指针设置为NULL不会取消分配它。

如果您正在使用使用基于堆的malloc的实现,请调试分配,使用和释放内存的内容,并对分配,使用和将指向内存的指针设置为NULL的内容执行相同操作。

内存管理依赖于实现(参见http://en.wikipedia.org/wiki/Malloc#Implementations)。

答案 6 :(得分:1)

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。

答案 7 :(得分:1)

p=NULL不释放内存。如果您不再需要使用p指向的内存,则应使用free()否则会出现内存泄漏。您还应在调用p=NULL后设置free(),以避免将来再次错误地访问该内存。