コンテナ
そういえばコンテナにポインタをいれた場合どうなるんだっけ?と思ったけどあたり前のことだったというおはなし。
#include <iostream> #include <vector> using namespace std; class A { public: A() { cout << "ctor" << endl; } ~A() { cout << "dtor" << endl; } }; int main() { vector<A*> v; v.push_back( new A() ); return 0; }
当然コンテナにいれた要素(ポインタ)の先は破棄されない。
ここでスマートポインタを使ってみる。
#include <iostream> #include <vector> #include <boost/shared_ptr.hpp> #include <boost/make_shared.hpp> using namespace std; using namespace boost; class A { public: A() { cout << "ctor" << endl; } ~A() { cout << "dtor" << endl; } }; int main() { vector<shared_ptr<A> > v; v.push_back( make_shared<A>() ); return 0; }
こちらはちゃんと解放されます。
まぁ理由は各要素のデストラクタは呼ばれるのでvectorが破棄されるときに各shared_ptrのデストラクタが呼ばれてそこから破棄されるからですね。
ということでまた忘れそうな気がしたので備忘録。