以下は、VC10 beta2で確認した。
よくあるコードでコンテナにオブジェクトのポインタを入れることがあります。このとき、コンテナのデストラクタを呼ぶ前にポインタの差すオブジェクトのデストラクタを呼ばなければなりません。しかし、これはよく忘れます。
#include <iostream> #include <vector> using namespace std; class C { int n; public: C(int m) : n(m) { } ~C() { cerr << "C::~C" << endl; } void print() { cout << n << endl; } }; int main() { vector<C *> v; C *p = new C(1); v.push_back(p); v.front()->print(); // for(auto p = v.begin(); p != v.end(); ++p) // delete *p; }
1
これではメモリリークしてしまいます。
こういうときにshared_ptrを使うとうまく動きます。
#include <iostream> #include <vector> #include <memory> // 無くても動いたが // 同じところは省略 int main() { vector<shared_ptr<C>> v; shared_ptr<C> p(new C(1)); v.push_back(p); v.front()->print(); }
1 C::~C