是否必须释放每个malloc调用

RC1*_*140 8 c malloc pointers

根据我的理解,因为malloc动态分配mem,你需要释放该mem以便它可以再次使用.

  1. 如果你返回一个使用malloc创建的char*会发生什么(例如你应该如何释放它)
  2. 如果您将指针保持原样并退出应用程序将被释放.(我无法找到明确的答案,有些人说是,有些人说没有).

Pet*_*ter 8

  1. 如果你有一个指向内存的指针malloc,free那个内存,使用那个指针,将做正确的事情.是的,有一些魔法涉及; 这将由您的编译器处理.

  2. 是的,如果忽略内存释放并退出应用程序,操作系统将释放内存.然而,将其视为不一致被认为是不好的做法.操作系统可能无法做正确的事情(特别是在嵌入式设置中),或者可能无法及时完成.此外,如果您持续运行程序,最终可能会消耗越来越多的内存,最终消耗掉所有内存,并耗尽内存并崩溃.


Ste*_*sop 8

  1. 呼叫者必须释放它(或安排它被释放).这意味着创建和返回资源的函数需要准确记录它应该如何被释放.

  2. 大多数操作系统将在程序退出时释放内存,作为"进程"定义的一部分.C标准并不关心会发生什么,它超出了程序的范围.并非所有操作系统都具有完整的流程抽象,但桌面式操作系统肯定会这样做.

在此之前释放它的主要原因是:

  • 如果您尽快释放内存,通常在进程退出前很长一段时间,您的程序总共使用较少的内存.
  • 如果你没有释放它,并且你以后想要将程序更改为另一个程序中的例程,这可能被多次调用,那么突然间你需要的内存比以前多很多(内存泄漏).
  • 通过警告您在程序退出时仍然分配的内存,有一些调试工具可以帮助您识别内存泄漏.如果有很多故意泄露的垃圾可以通过,这些并没有多大帮助.
  • 如果你没有释放它并且你遇到任何问题,那么以后回去并找到所有需要释放的内存要比在第一时间做到这一点要困难得多.
  • 在很多情况下你需要释放内存(以防止在长时间运行的程序中使用大量内存),你的默认策略必须是干净几乎所有东西.

不自由的含糊其词的理由是:

  • 更少的代码.
  • 如果在程序退出之前就有单独的块可以单独释放,那么让操作系统放弃整个过程可能要快得多.
  • 如果您不确切知道它的使用位置,那么按需创建并存储在全局中的东西可能很难安全清理.想想你在进行时填充的某种缓存,可能有MRU规则来限制它占用的内存量,因此它不是无限制的泄漏.好的,所以这是一件坏事(不受限制的全局变量)导致另一件坏事(不同意的内存),但值得了解的原因是你可能会在现有代码中看到不一致的块,而你不一定只是进入并修复他们.

解放的原因几乎总是超过反对的原因.


Squ*_*ama 5

是。如果您使用malloc,则需要释放。如果您不释放程序,则可以保证程序运行时内存泄漏。

释放它。

总是。

期。


Nik*_*sov 5

是的,每个调用 tomalloc()都必须与调用匹配free()。

要回答您的具体问题:

  1. 您必须明确记录您的 API,告诉用户是否必须free()“d ”返回的指针
  2. 操作系统将释放分配给进程的所有内存。