コンテナ

そういえばコンテナにポインタをいれた場合どうなるんだっけ?と思ったけどあたり前のことだったというおはなし。

#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;
}

実行結果
http://ideone.com/T3pXC

当然コンテナにいれた要素(ポインタ)の先は破棄されない。


ここでスマートポインタを使ってみる。

#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;
}

実行結果
http://ideone.com/SeYr2

こちらはちゃんと解放されます。


まぁ理由は各要素のデストラクタは呼ばれるのでvectorが破棄されるときに各shared_ptrのデストラクタが呼ばれてそこから破棄されるからですね。

ということでまた忘れそうな気がしたので備忘録。