程序结束后内存泄漏有影响吗?
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;
显然foo
在main
的末尾超出范围并调用了它的析构函数,而bar
不会调用它的析构函数,除非在其上调用delete
。因此bar
指向的Simple
对象以及nums
数组将在堆中丢失。虽然这显然是不好的做法,但由于程序立即结束,这真的很重要吗?我的理解是否正确,操作系统将在它结束后释放它分配给该程序的所有堆内存?我的错误决定的影响是否仅限于它的运行时间?
【问题讨论】:
在 C++ 中,类声明以分号结尾。到目前为止,您的程序甚至无法编译。 here你应该找到答案 杜尔。你是对的。固定。 这不是一个好习惯,但操作系统总是会在您清理并释放您拥有的任何已分配内存(实际上,操作系统只关心虚拟内存映射 - 它不知道也不关心如何malloc()
已实现,它只处理对 mmap(2)
/munmap(2)
或等效于映射/取消映射虚拟内存地址的调用。
好的。那正是我所想。我只是需要确认一下。谢谢。
【参考方案1】:
任何现代操作系统都会在它终止后回收任何进程分配的所有内存。 在当今所有常见的操作系统中,每个进程都有自己的虚拟地址空间,因此操作系统很容易收回所有内存。 不用说,为此依赖操作系统是一种不好的做法。 这本质上意味着这样的代码不能在长时间运行的程序中使用。 此外,在现实世界的应用程序中,析构函数的作用可能远不止释放内存。 网络客户端可能会发送终止消息,与数据库相关的对象可能会提交事务,并且文件包装对象可能会将一些闭包数据写入其文件。 换句话说:不要让你的内存泄漏。
【讨论】:
这是一种不好的做法吗?现代苹果、firefox 和其他人在退出时不会主动清理内存,以提高关机速度,在某些情况下可能需要十分钟。 @Deduplicator 在艺术中,没有“没有这样的东西”。我想每件事都可以很好地利用,并不是说我知道有人这样做。我会改写 - 一般来说,这是一种不好的做法。以上是关于程序结束后内存泄漏有影响吗?的主要内容,如果未能解决你的问题,请参考以下文章