【问题标题】:Crouton environment does not free memory after exiting program?退出程序后Crouton环境不释放内存?
【发布时间】:2018-03-01 06:11:31
【问题描述】:

我不熟悉使用 Crouton。我正在尝试将它用于 linux 环境中的一些 C 编程实践。每当我运行一个使用 malloc() 的程序时,我都会收到 x 个字节的内存泄漏错误。当我明确释放分配的内存时,内存泄漏错误消失了。这是Crouton问题还是整体上的Ubuntu问题?

有什么办法可以解决这个问题,这样我就不必每次都显式释放分配的空间了?我知道 free()ing 是一种很好的编码习惯等等,但我只是想知道是否有办法让分配的内存在退出后自动释放。

【问题讨论】:

  • 你为什么要改变我们做事的方式 - 这是你释放他们的呼吁,你正在这样做。应该是这样的。为什么要避免它?
  • 分配的内存在进程退出后不再存在,因为它仅在进程地址空间中分配并且该地址空间不再存在。
  • 我明白明确释放是最佳实践。我只是想知道为什么 Crouton 没有自动为你做这件事。将来我肯定会使用 free,因为随着程序变得更大更复杂,它通常是解决内存泄漏的好方法。
  • 什么是报告内存泄漏错误?编译到程序中的东西会在程序退出时打印报告?调试器还是 IDE?克鲁顿的东西?您运行的外部程序?
  • @coderredoc:如果一个程序正在退出,释放它的内存有什么好处?在进程中释放内存只会改变数据结构,当操作系统释放进程使用的内存时,这些数据结构就会消失。释放所有内存的进程退出的最终结果与没有释放所有内存的进程退出的最终结果相同,因此花费时间来释放内存是浪费计算时间。 (当程序继续运行时,内存必须在正在进行的进程中释放,但最终终止不需要释放内存。)

标签: c memory-leaks malloc crouton-os


【解决方案1】:

在 Linux(和大多数现代多任务操作系统)上,当进程退出(或终止,例如通过信号)时,其所有资源都由操作系统内核释放,包括其virtual address space

所以肯定有可能在退出之前忘记free堆内存,许多(但不是全部)程序都在这样做。

如果您正在开发应用程序,您可能仍希望在退出时正确地free 每个动态分配的内存区域。这有助于使用内存泄漏检测工具,如valgrind(但需要一些开发工作,甚至需要一些运行时间)。

【讨论】:

  • OP 说报了内存泄漏错误。如果这是一个运行程序的简单案例,程序退出,操作系统拆除它的内存,就不会出现内存泄漏报告。发生了一些额外的事情,我们应该在回答之前了解这一点。
【解决方案2】:

CManual memory management语言,这意味着你需要释放你手动分配的内存,而不是Garbage collection。您可以使用诸如atexit() 之类的函数来促进程序退出时的内存释放过程,但我个人不建议将此作为良好的编程习惯。如果你使用C编程语言编程,你应该学会使用free()释放内存。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2019-09-08
    • 2011-03-08
    • 2011-11-03
    • 2020-04-12
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多