c++ - vector教學 - 我如何強制我的std:: map釋放使用的內存?




vector c++ create (4)

我正在使用std :: map,我似乎無法將內存釋放回操作系統。 看起來像,

int main(){
  aMap m;

  while(keepGoing){
    while(fillUpMap){
       //populate m
    }
    doWhatIwantWithMap(m);
    m.clear();//doesnt free memory back to OS

    //flush some buffered values into map for next iteration
    flushIntoMap(m);
  }
}

每個(fillUpmap)分配1gig左右,所以我非常感興趣的是,在我吃完所有的記憶之前,把它回到我的系統。

我經歷了與std :: vector相同,但在那裡我可以強迫它通過與一個空的std :: vector交換釋放。 這不適用於地圖。

當我使用valgrind時,它說所有的內存都被釋放了,所以它不是洩漏的問題,因為在運行之後,所有的內容都被很好地清理了。

編輯:

清除後必須出現沖水。

https://code.i-harness.com


m.clear()將內存釋放回堆中,但堆實現通常不會將其釋放回操作系統(即使它們可以執行碎片等問題也很難)。

這就是默認分配器的工作原理,如果你已經為映射指定了自己的分配器,它可能有自己的緩存。 但是,即使在這種情況下,也應該被緩存以便立即被重用。

地圖沒有容量的大小和矢量的大小的概念。


也許你可以創建一個自定義分配器,或者只是使用Boost的池庫。


如果你在堆上創建地圖(通過新建),刪除它將釋放它使用的任何內存。


當我把一些數據放在一個std :: map中,然後調用std :: map :: clear()時,我做了一個簡單的測試。

typedef std::map<int, unit_t,std::less<int>,  
     my_allocator<std::pair<const int, unit_t>, 4 > > contaner_t;
contaner_t keys;
keys[1] = 10;
keys[2] = 20;
keys[3] = 30;
keys.clear();

這是在我的測試中插入printf的結果:

Allocator # 4, Memory consumption:      56     (allocated   :       56)
Allocator # 4, Memory consumption:     112     (allocated   :       56)
Allocator # 4, Memory consumption:     168     (allocated   :       56)
Allocator # 4, Memory consumption:     112     (deallocated :       56),
Allocator # 4, Memory consumption:      56     (deallocated :       56),
Allocator # 4, Memory consumption:       0     (deallocated :       56),

我想你可能也應該檢查你的分配器的行為,但我認為你的默認std :: allocator事實上釋放內存,如你所料,但內存不返回到操作系統。 順便說一下你用什麼操作系統?

這裡的問題是你如何衡量can't seem to free the memory back to the OS. 你怎麼能確定, I could force it to free by doing a swap with an empty std::vector. 你真的確定分配的內存實際上回到操作系統?





map