by 値を取るshared_ptr
と、参照カウントが増加します。これは、次の場合に簡単ですtypedef
。
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr obj)
{
obj->/* stuff*/;
obj.reset(); //only resets this local copy, that means:
// reduce reference count (back to 1), and
// set obj to point at null.
}
int main(void)
{
object_ptr obj(new object());
foo(obj);
}
参照はエイリアスであることに注意してください。参照渡しの場合、ポインターやコピーなどを渡すのではなく、別のオブジェクトにエイリアスを設定しています。(実際には、それらはポインタとして実装されています):
typedef boost:shared_ptr<object> object_ptr;
void foo(object_ptr& obj)
{
obj.reset(); // the references was never increased, since a copy has not
// been made, this *is* obj in main. so the reference
// goes to 0, and obj is deleted
}
int main(void)
{
object_ptr obj(new object);
foo(obj); // after this, obj has been reset!
}
const
エラーを防ぐために、常に正しいことを忘れないでください。
typedef boost:shared_ptr<object> object_ptr;
void foo(const object_ptr& obj)
{
obj.reset(); // cannot do!
}
int main(void)
{
object_ptr obj(new object);
foo(obj);
}
無関係な増分と減分 (およびコピーなど) を避けるために、可能な場合はスマート ポインターを参照として渡すことをお勧めします。