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

San*_*ngi 22 c free pointers

有人可以告诉我之间的区别:

int *p;
p=(int*)malloc(10*sizeof(int));
free(p);
Run Code Online (Sandbox Code Playgroud)

要么

int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
Run Code Online (Sandbox Code Playgroud)

dan*_*ben 40

free将释放p指向的内存- 简单地指定它NULL不会(因此你将有内存泄漏).

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

  • 在C中,指针实际上只是一个值,就像一个int.当你将它设置为带有'='的值时,所有发生的事情就是它被设置为该值,在幕后没有任何其他事情发生. (5认同)

ric*_*son 10

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

希望这有助于干杯


mjv*_*mjv 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 !!!
Run Code Online (Sandbox Code Playgroud)

要么

  // 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.
Run Code Online (Sandbox Code Playgroud)

后一种情况只是浪费资源,前者可能导致难以发现的错误.

这就是为什么典型的C语言是:

   free(p);
   p = NULL;
Run Code Online (Sandbox Code Playgroud)