次のテストプログラムでは、std::map
によって割り当てられたメモリは割り当て解除されません。私たちは空のコンテナでスワップしますが、まったくのことではなく、約2.2 GBのメモリを割り当てます。なぜstd :: map < std::map >はメモリの割り当てを解除しませんか?
std::map<std::map>
をstd::map<std::vector>
に変更すると、実際にメモリが解放されます。
valgrindでコードをチェックしましたが、これは酷く漏れは見つかりませんでした。
なぜこの場合、どのように動作を変更できますか?
#include <cstdlib>
#include <iostream>
#include <vector>
#include <map>
#include <chrono>
#include <thread>
class Test
{
public:
std::vector< std::pair< int, int > > myContainer;
std::map<int,int> myMap;
Test(){
for(int i = 0 ; i < 10000; i++ ){
std::pair<int, int> pair = std::make_pair<int, int>(rand(), int(i));
//myContainer.push_back(pair);
myMap.insert(pair);
}
}
};
int main()
{
std::map<int,Test> myContainer1;
for(int i = 0 ; i < 5000; i++ ){
myContainer1.insert(std::make_pair<int, Test>(rand(), Test()));
}
std::cout << "ready!" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
std::cout << "cleaning..." << std::endl;
{
std::map<int,Test> tmp;
myContainer1.swap(tmp);
}
std::cout << "cleaning ready!" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(15000));
return 0;
}
どのようにメモリが解放されていないと判断していますか? –
システムモニタ、常駐メモリサイズを使用しました。 'map < vector >'を使用すると、プロセスRSSが数MBにまで減少することがわかります。 'map
@bicuは必ずしもメモリが解放されているわけではありません(RSS *は通常は* VSIZEよりも優れたインジケータです)。 'valgrind'は、通常、プログラム終了時にまだ割り当てられているメモリの量を報告します(他のものの中でも)、リソースモニタの統計値を見るよりもはるかに信頼性があります。どのような価値観がありますか? – Andrew