多くのnewによって作られるポインタは下記のどれかで置き換えることが可能である.当然,置き換えたほうがよい.
- shared_ptr<T>: 参照カウンタつきスマートポインタ.参照が0になったときに破棄される.循環参照に弱い.
- unique_ptr<T>: (boost::scoped_ptr) コピー禁止スマートポインタ.生ポインタを渡すのは可.スコープを抜けるとき,もしくは所有するクラスが破棄される時に破棄される.
- weak_ptr<T>: shared_ptrから作る.参照カウンタを増加させたくないときに使う.参照するだけで所有はしない場合など.
shared_ptrは安易に導入することが可能であるが,参照カウンタを用いるということは複数のオブジェクトが所有権を持つということを意味する.
すなわち,どのオブジェクトが所有するか不明瞭すなわちポインタの管理責任が曖昧となってしまう.そのため真に複数のオブジェクトにわたって所有されるべきかどうか検討すべきであろう.
単に参照する場合は所有者がunique_ptrを用いるか,weak_ptrとして渡すべきである.
すなわち,どのオブジェクトが所有するか不明瞭すなわちポインタの管理責任が曖昧となってしまう.そのため真に複数のオブジェクトにわたって所有されるべきかどうか検討すべきであろう.
単に参照する場合は所有者がunique_ptrを用いるか,weak_ptrとして渡すべきである.
{ shared_ptr<Hoge> p1( new Hoge ); shared_ptr<Hoge> p2 = p1; p1->Foo(); *p2.mBar; } //p1 and p2 are deleted here. { Hope* pHoge = new Hoge; shared_ptr<Hoge> p1( pHoge); shared_ptr<Hoge> p2( pHoge); }//error { unique_ptr<Hoge> p1(new Hoge); //unique_ptr<Hoge> p2 = p1; //error unique_ptr<Hoge> p3 = move(p1) //ok. transfer of ownership } //p1 and p3 are deleted. { shared_ptr<Hoge> p1( pHone); weak_ptr<Hoge> pweak = p1; //reference count isn't incremented. shared_ptr<Hoge> p2 = p1.lock(); //weak_ptr -> shared_ptr, reference count is incremented since the pointer is referenced by p2. }
コメントをかく