程序结束后内存泄漏有影响吗?

Posted

技术标签:

【中文标题】程序结束后内存泄漏有影响吗?【英文标题】:Do memory leaks have any effect after the program ends? 【发布时间】:2014-09-07 10:59:49 【问题描述】:

我的问题是关于堆上分配的内存的绝对范围。假设您有一个简单的程序,例如

class Simple

private:
  int *nums;
public:
  Simple()
  
    nums = new int[100];
  
  ~Simple()
  
    delete [] nums;
  
;

int main()

  Simple foo;
  Simple *bar = new Simple;

显然foomain 的末尾超出范围并调用了它的析构函数,而bar 不会调用它的析构函数,除非在其上调用delete。因此bar 指向的Simple 对象以及nums 数组将在堆中丢失。虽然这显然是不好的做法,但由于程序立即结束,这真的很重要吗?我的理解是否正确,操作系统将在它结束后释放它分配给该程序的所有堆内存?我的错误决定的影响是否仅限于它的运行时间?

【问题讨论】:

在 C++ 中,类声明以分号结尾。到目前为止,您的程序甚至无法编译。 here你应该找到答案 杜尔。你是对的。固定。 这不是一个好习惯,但操作系统总是会在您清理并释放您拥有的任何已分配内存(实际上,操作系统只关心虚拟内存映射 - 它不知道也不关心如何malloc() 已实现,它只处理对 mmap(2)/munmap(2) 或等效于映射/取消映射虚拟内存地址的调用。 好的。那正是我所想。我只是需要确认一下。谢谢。 【参考方案1】:

任何现代操作系统都会在它终止后回收任何进程分配的所有内存。 在当今所有常见的操作系统中,每个进程都有自己的虚拟地址空间,因此操作系统很容易收回所有内存。 不用说,为此依赖操作系统是一种不好的做法。 这本质上意味着这样的代码不能在长时间运行的程序中使用。 此外,在现实世界的应用程序中,析构函数的作用可能远不止释放内存。 网络客户端可能会发送终止消息,与数据库相关的对象可能会提交事务,并且文件包装对象可能会将一些闭包数据写入其文件。 换句话说:不要让你的内存泄漏。

【讨论】:

这是一种不好的做法吗?现代苹果、firefox 和其他人在退出时不会主动清理内存,以提高关机速度,在某些情况下可能需要十分钟。 @Deduplicator 在艺术中,没有“没有这样的东西”。我想每件事都可以很好地利用,并不是说我知道有人这样做。我会改写 - 一般来说,这是一种不好的做法。

以上是关于程序结束后内存泄漏有影响吗?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏和内存溢出

内存泄漏和内存溢出有啥区别?

内存泄漏和内存溢出有啥区别?

有关内存溢出和内存泄漏的知识点

JAVA内存泄漏和内存溢出的区别和联系

请解释一下“内存泄漏”,这个问题会有啥影响