http://d.hatena.ne.jp/iww/20120705/shared_ptr から改造してみる
#include <iostream> #include <boost/shared_ptr.hpp> using namespace std; using namespace boost; class Hoge { private: Hoge(){} public: void echo(){ cout << "HELLO" << endl; } virtual ~Hoge(){ cout << "BYE" << endl; } static shared_ptr<Hoge> create() { return shared_ptr<Hoge>(new Hoge); } }; int main() { // スコープに入る { shared_ptr<Hoge> a; a = Hoge::create(); a->echo(); // 普通に使える a = Hoge::create(); // 最初にnewした分の参照が無くなり、デストラクタ発動 } // スコープ切れにより、デストラクタ発動 cout << "END" << endl; // Hoge *b = new Hoge(); ←コンパイルエラーにする return 0; }
スマートポインタって返してもいいのかな。よくわからん。Effective C++に書いてあるのかな。
TR1 の仕様では触れられていませんが、通常、スレッドセーフにするために、これらのコンストラクタは内部で排他制御が行われます。結果として、通常のポインタに比べて、shared_ptr のコピーは非常にコストが大きいものとなります。
3.1 shared_ptr | 株式会社きじねこ
やっぱり良くなさそうな感じ。