2014-10-11 28 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沒有析構函數。但是,調試版本是一個例外,因此您可以在調試器中研究舊的數組內容。