內存清理我有一個Mac上的C++代碼看起來是這樣的:C++在Mac
Object* objectArray = new Object[1000];
// do some stuff...
delete[] objectArray;
現在編譯大,運行很好
然而,當我在看活動監視器該過程中,我發現我分配了250MB,即使在執行delete[]
聲明後,它也不會再變爲可用。有沒有辦法在不退出C++應用程序的情況下再次使用該內存?
內存清理我有一個Mac上的C++代碼看起來是這樣的:C++在Mac
Object* objectArray = new Object[1000];
// do some stuff...
delete[] objectArray;
現在編譯大,運行很好
然而,當我在看活動監視器該過程中,我發現我分配了250MB,即使在執行delete[]
聲明後,它也不會再變爲可用。有沒有辦法在不退出C++應用程序的情況下再次使用該內存?
回聲@sftrabbit和@pmr:當您分配一塊內存時,操作系統至少會爲您標記爲「活動」的那麼多內存。您將在系統內存下的活動監視器中看到這個術語。然後,當你完成它時,你至少將其中的一部分標記爲「非活動」,這意味着操作系統可以自由前來,如果需要的話可以將其從你手中拿走。實際上回收它有點貴,而且系統假定如果你一次要求記憶,你可能會再次需要它,所以除非有內存壓力,否則它不會打擾你。當操作系統回收它時,它會將其標記爲「自由」,除非其他進程立即需要它。
雖然不一定與您的C++代碼相關,但在您的ObjC代碼中,您會發現解除分配的內存甚至可能不會顯示在「非活動」池中。可可(真正的CoreFoundation)維護着分配的內存塊池,它可以快速地退出。這避免了malloc()
的大量開銷。與您的問題沒有特別的關係,但通常在Mac應用程序中值得注意。
雖然我普遍認爲這不是一個大問題,但我不會對此充滿激情。分配和釋放大塊內存仍然很昂貴,並且可能迫使系統陷入內存壓力的狀況,在這種情況下,它必須實際上爲其內存錯誤的其他進程,從而降低整體系統性能(然後在其他應用程序時使其更加昂貴需要稍後分配內存)。如果你能避免它,那麼值得努力保持你的高水位記錄(你要求的最大記憶)不必要地加標籤。
但是,如果你真的需要這個記憶,這不是問題。記憶在那裏被使用。
僅僅因爲內存不能立即再次可用並不意味着操作系統不會在另一個進程請求更多內存時從進程中獲取內存。你看到的是很多程序中發生的事情,並且一遍又一遍地讓用戶感到困惑,但它通常不值得你花時間。如果沒有泄漏,你很好。
呼叫new
爲對象分配內存。如果免費商店中沒有足夠的內存來滿足請求,庫會要求操作系統提供更多內存。對delete
的調用不一定會將該內存返回到操作系統。假設程序稍後將在免費商店中使用更多內存,那麼該庫通常會掛載到該內存上。因此,操作系統級別的工具不會顯示內存已被釋放,因爲這些工具不會查看應用程序免費商店的內部結構。他們看到的只是操作系統給應用程序留下了一些內存,還沒有得到迴應。
讓操作系統關心這一點。它幾乎肯定會重用該內存或在更合適的時間釋放它。 – 2013-04-29 21:31:55
由於下面列出的原因,活動監視器不能準確報告內存使用情況。 – 2013-04-29 21:53:56