#include <iostream> #include <boost/shared_ptr.hpp> using namespace std; class Hoge { public: void echo(){ cout << "HELLO" << endl; } virtual ~Hoge(){ cout << "BYE" << endl; } typedef boost::shared_ptr<Hoge> Ptr; }; int main() { { Hoge::Ptr a; a = Hoge::Ptr(new Hoge); a->echo(); // 普通に使える a = Hoge::Ptr(new Hoge); // 最初にnewした分の参照が無くなり、デストラクタ発動 } // スコープ切れにより、デストラクタ発動 cout << "END" << endl; return 0; }
$ ./a.out HELLO BYE BYE END
リストに入れても使える
#include <iostream> #include <list> #include <boost/shared_ptr.hpp> using namespace std; class Hoge { public: int number; Hoge(int a){ number=a; cout << "NEW:" << number << endl; } virtual ~Hoge(){ cout << "DELETE:" << number << endl; } typedef boost::shared_ptr<Hoge> Ptr; typedef list<Ptr> List; }; int main() { { Hoge::List hogelist; hogelist.push_back( Hoge::Ptr(new Hoge(10)) ); hogelist.push_back( Hoge::Ptr(new Hoge(20)) ); hogelist.push_back( Hoge::Ptr(new Hoge(30)) ); } cout << "END" << endl; return 0; }
$ ./a.out NEW:10 NEW:20 NEW:30 DELETE:10 DELETE:20 DELETE:30 END