shared_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.
}