我的问题是关于堆上分配的内存的绝对范围。假设您有一个简单的程序,如
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
,否则不会调用其析构函数。因此Simple
指向的bar
对象以及nums
数组将在堆中丢失。虽然这显然是不好的做法,但实际上它是否真的重要,因为程序会立即结束?我是否理解操作系统将释放它在分配给该程序后所有堆内存?我的错误决定的影响是否仅限于它的运行时间?
答案 0 :(得分:3)
任何现代操作系统都会在终止后回收任何进程分配的所有内存
现在,每个进程在所有常见操作系统中都有自己的虚拟地址空间,因此操作系统很容易将所有内存都归还。
毋庸置疑,依靠操作系统是不好的做法
它本质上意味着这样的代码不能用于运行很长时间的程序中。
此外,在现实世界的应用程序中,析构函数可能远不仅仅是释放内存
网络客户端可以发送终止消息,数据库相关对象可以提交事务,文件包装对象可以将一些闭包数据写入其文件。
换句话说:不要让你的记忆泄漏。