【问题标题】:Will C automatically free memory with no pointers?C 会在没有指针的情况下自动释放内存吗?
【发布时间】:2016-07-15 23:09:53
【问题描述】:

假设我们单独运行这段代码:

malloc(1024);

这会导致内存泄漏,还是 C 会自动知道释放没有引用的指针?

换句话说,我可以避免将它分配给指针吗?

void *p = malloc(1024);
free(p);

【问题讨论】:

  • 您所说的称为垃圾收集器。 C(通常)没有这样的功能。这里的规则很简单:如果对 malloc()(和其他 *alloc() 函数)的每次调用与对 free() 的调用恰好匹配,则没有泄漏。
  • 如果不将malloc()的结果赋值给变量,如何访问分配的内存?
  • 换个说法,1024字节的内存你不使用为什么要分配?
  • 实际的应用程序是我嵌套几个函数调用的地方,每个函数调用都返回新的指针。喜欢bignum *add(bignum *a, bignum *b)
  • @cchan3141 声明const bignum* const a 之类的参数并且不要在函数中更改它们,然后释放由调用者决定

标签: c pointers memory-management


【解决方案1】:

在您编写的任何动态分配内存的代码中,对于分配的任何内存块,您都有 2 个职责:(1)始终保留指向起始地址的指针内存块,因此 (2) 当不再需要它时可以释放。释放内存由决定。

如果您将新的内存块分配给当前指向现有内存块的指针而没有首先释放该块,则您只是覆盖了起始地址对于指针持有的原始内存块(违反 上面的规则 1),您现在已经失去了释放原始块的能力 - 这就是您的内存泄漏。

【讨论】:

  • 感谢您非常清楚的解释。最初的应用程序是一堆嵌套函数调用,每个调用都返回新指针,看来我必须确保在调用每个下一个函数之前先将指针保存在某个地方。
  • @David 你能给我解释一下我的Question吗?
  • 当然可以,但看起来您已经整理好了。我的猜测是你 -O2 优化优化了分配的不使用导致来自valgrind0 bytes allocated 消息?看来你现在有答案了。如果您还有其他问题,请尽管提问。
  • 我还是不行,因为答案和 cmets 没有显示一些参考,我可以检查这是否属实,即使可能是正确的。使用 -O0 而不是 -O2 之类的东西并不能解释为什么没有发现泄漏
  • 好的,让我把菜等吃完……我再仔细看看。我最初的外观显示valgrind 报告0 bytes allocated 5.2,这意味着不会报告泄漏(即使您有代码会产生泄漏),因为一开始没有分配内存——因此可以无泄漏报告。报告中的差异通常与编译器优化/未优化的内容有关。如果您从不使用分配的内存,编译器就永远无法分配它并优化所有代码。 (让我仔细看看)
【解决方案2】:

这是内存泄漏。 C 绝对不会为您进行内存管理(C 编译器为变量分配堆栈空间除外)。

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多