type のフィールドを持つクラスがありますunordered_map
。アプリケーションでこのオブジェクトのインスタンスを 1 つ作成し、shared_ptr
. オブジェクトは非常にメモリを消費するので、使い終わったらすぐに削除したいと考えています。ただし、ポインタをリセットしても、オブジェクトが占有していたメモリのごく一部しか解放されません。オブジェクトが占有しているすべてのメモリをプログラムに解放させるにはどうすればよいですか?
次のモック プログラムは、私の問題を再現します。ガベージを出力する for ループは、 で使用されるメモリを観察するのに十分な時間を与えるためだけに存在しtop
ます。デストラクタは の直後に呼び出されreset()
ます。また、直後にメモリ使用量が約2GBから1.5GBに減少。
#include <iostream>
#include <memory>
#include <unordered_map>
using namespace std;
struct A {
~A() {
cerr << "Destructor" << endl;
}
unordered_map<int, int> index;
};
int main() {
shared_ptr<A> a = make_shared<A>();
for (size_t i = 0; i < 50000000; ++i) {
a->index[2*i] = i + 3;
}
// Do some random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "First" << endl;
}
a.reset();
// More random work.
for (size_t i = 0; i < 3000000; ++i) {
cout << "Second" << endl;
}
}
コンパイラ: g++ 4.6.3。