2009-07-31 52 views
0

我有一臺Win XP 32位機器。我正在使用Visual C++語言來測試這種情況。 我創建了一個矢量像矢量< __int64> v。我記下虛擬內存,現在說它的400 KB。然後我推送500萬左右的整數。現在我注意到了虛擬內存,它增加了大約900 KB。現在我在矢量上調用擦除或清除。現在我檢查它的600 KB的虛擬內存。__int64 vs int - 內存管理

我嘗試使用int v向量的相同場景。這次我在填充矢量和刷新矢量之前得到確切的內存量。

爲什麼內存有差別?

來自評論:SmartHeap被使用。

+0

如果SmartHeap未被使用會得到什麼結果? – 2009-07-31 08:42:20

+0

我得到了相同的結果 – 2009-07-31 08:44:14

回答

2

運行時不會總是將內存釋放回操作系統,它會保留內存以防將來需要它。有時內存也會相當分散,所以沒有簡單的方法將其釋放回操作系統。

分配器通常會保留內存(大於您的程序分配)塊,因此查看內存使用情況可能不會反映您的程序的內存分配和釋放情況。

它無論如何都是虛擬內存,所以它不像耗盡機器的物理內存那麼重要。

+0

它確實很重要...因爲後來在我的應用程序中,虛擬內存不足 – 2009-07-31 07:39:40

+2

不夠公平,但是nos的主要觀點是內存不一定會因操作系統而釋放它來自你的控制。內存管理非常複雜,很少如同分配X一樣簡單,當您釋放時返回X。 – quark 2009-07-31 07:50:54

+0

這些是有效的分數。顯示可能未釋放內存的小實驗可能與耗盡虛擬內存無關(可能是代碼泄漏)。 – nik 2009-07-31 07:53:34

3

除了回答內存不總是釋放到操作系統上,您的測試也可能受到以下事實的影響:從向量中清除元素或清除向量不會減少向量分配的緩衝區大小。

爲了保證內存的版本,請確保您的矢量超出範圍,或者使用一個臨時的向量:

{ 
    std::vector<__int64> temp; 
    v.swap(temp); 
} 
+0

這是顯而易見的減少的內存只有超出範圍後。這就是我提到的結果 – 2009-07-31 08:07:53

0

的主要原因是內存碎片不使運行時釋放所有的虛擬內存。您應該考慮使用自定義分配器進行如此大的分配。檢查出boost::pool_alloc是自定義分配器的一個非常好的實現。

使用Pools可以讓您更好地控制程序中如何使用內存。例如,你可能會遇到這樣的情況:你想在一個點上分配一堆小物體,然後到達程序中的一個點,這樣就不再需要它們了。使用池接口,你可以選擇運行它們的析構函數或者直接丟棄它們;池接口將保證沒有系統內存泄漏。

+0

@ Jla3ep我正在使用SmartHeap – 2009-07-31 08:11:26

+1

可能那麼這是SmartHeap的實現問題? – 2009-07-31 08:14:40

0

夥計們我在這裏遇到了問題。

對於__int64 如果我在第一個位置爲矢量保留了一些字節,然後進行插入然後清除矢量,我得到原始的回憶。然而,讓我困惑的是,爲什麼這種方法對於一個法向量不是必需的,如果int。

+0

我有這個想法。如果您保留從堆中進行單個分配。這不會碎片和清除將容易釋放堆。 – nik 2009-07-31 09:45:32