2014-10-11 23 views
1

比方说,我有很多内存将被分配在程序中的某些点。内存泄漏的重大争论之一是,如果在流程执行结束时将被操作系统回收,则占用大量内存是可以的。问题在于,即使泄漏是良性的,它仍然会占用内存。我希望我的流程每次只能处理大量的内存。这就是我的意思:尽早破坏事物是否过早优化?

{ // begin block 
    int a[some_large_number]; 
    do_work_with_a(); 
} // destruct large allocation 

{ // different block 
    int a[some_large_number]; 
    do_work_with_a(); 
} // destruct large allocation 

它真的有很大的区别吗?

+0

虽然本地数组并没有分配在堆上,但它们分配在堆栈上。这里唯一的“分配”是为这些数组保留一些堆栈空间。 – cdhowie 2014-10-11 17:38:39

+0

我会说,一般来说,一旦你完成了记忆,释放它。 – Niall 2014-10-11 17:44:31

+0

因此,下一代C++程序员认为这是可以辩论的天气或不记忆泄漏是好的?我们都注定要失败。 – 2014-10-11 18:07:33

回答

3

你的例子是不相关的,那些变量在堆栈上,不需要被释放。

此外,释放内存也不是优化,而是必须的。每次在堆上预留内存的调用都应仔细处理并在使用后解除分配。

你可以在堆和堆栈here阅读更多。

+0

这是处理事情的常用方式,但从内存管理的角度来看,同时释放整个内存池(堆)同样有效,而不是单独释放内存分配。当然,这是假设琐碎的析构函数。 – 2014-10-11 17:47:01

0

首先,这里a是在堆栈中,因此希望some_large_number不是太大,因为线程的堆栈大小通常以单位数字兆字节度量。

然后第二件事,因为你担心做正确的事情:不要没有实际原因使用C风格的数组。而应使用std::vectorstd::array或其他一些容器类。

而第三件事,你不能真正有任何内存泄漏与堆栈中的任何东西。你可能会有堆栈溢出,并且你可能会悬挂指向堆栈内已超出范围的指针,但内存泄漏......不。


说出来的方式,具有独立块肯定是堆栈的对象比较好,尤其是当他们将需要反正重新初始化,因为堆的简单分配操作非常简单,基本上只是调整栈指针寄存器。如果存在任何代码,拥有这些小范围将允许编译器为块之间的其他事物使用相同的堆栈空间。同样重要的是,它将清楚表明这些是单独的数组,并且不会传输数据,还可以启用有关未初始化变量的编译器警告(如果您重新使用变量并忘记重新初始化,则不会得到这些警告)。

但是,如果您有堆中的项目,例如您实际使用的是std::vector,那么情况会有所不同。堆分配更昂贵,无论是制作还是释放,所以如果它是代码中性能至关重要的部分,那么您可能宁愿重新使用已创建的std::vector

0

编号现代编译器将已经重用内存空间,因为int没有析构函数。但是,调试版本是一个例外,因此您可以在调试器中研究旧的数组内容。