23

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

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

或者

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

8 回答 8

43

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

值得一提的是,将指针分配给NULLAFTER 调用是一个好习惯free,因为这将防止您意外尝试访问已释放的内存(这仍然是可能的,但绝对不应该这样做)。

于 2010-03-12T06:02:23.250 回答
10

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

希望这有助于干杯

于 2010-03-12T06:03:10.987 回答
10

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;
于 2010-03-12T06:03:36.757 回答
2

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

于 2010-03-12T07:17:58.507 回答
2

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

free(p);
p = NULL;
于 2010-07-12T09:05:02.910 回答
1

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

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

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

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

于 2010-03-13T01:36:40.987 回答
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。

于 2012-05-24T00:56:25.873 回答
1

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

于 2017-07-25T14:39:00.507 回答