質問
auto_ptrがある場合、参照用に渡すことができますか?
auto_ptr<MyClass>Class(new MyClass);
void SetOponent(MyClass& oponent);
//So I pass SetOponent(Class)
そして、auto_ptrsの奇妙なコピーの振る舞いは何ですか?
解決
いいえ、できません。逆参照する必要があります:
SetOponent( * Class )
コピー動作については、Scott MeyersによるEffective C ++など、C ++に関する優れた本を読むことをお勧めします。 auto_ptrのコピー動作は非常に直感的ではなく、SOの答えの範囲を超える可能性があります。しかし、何も冒険しませんでした...
auto_ptrがコピーされると、所有権はオリジナルからコピーに移されます。例:
auto_ptr <Foo> p1( new Foo );
この時点で、p1はFooオブジェクトへのポインターを所有しています。
auto_ptr <Foo> p2( p1 );
コピー後、p2がポインターを所有し、 p1が変更され、NULLポインターを保持するようになります。コピーはC ++の多くの場所で発生するため、これは重要です。たとえば、auto_ptrsを値で関数に渡したり、標準ライブラリコンテナに保存したりしないでください。
他のヒント
奇妙なコピーの動作は、コピーを作成できず、元のコピーを保持できるということです。そのためにはshared_ptr
(boost ::またはstd :: tr1::)を使用します。これは、特にauto_ptrs
のSTLコンテナを使用できないことを意味します。 auto_ptr<>
は、寿命が限られているオブジェクトのコピーを1つ持つ場合に非常に便利です。別のSetOponent(*Class);
にコピーすると、最初のものが失われます。ポインタを渡すと、すでに削除されているオブジェクトを使用しようとする可能性が高くなります。
必要に応じてSetOpponent(Class.get())
を呼び出すことができます。これにより、実際のアイテムが渡されます(参照ではなくオブジェクトを渡します)。ポインターに渡す場合、<=>で呼び出すことができます。 Classがスコープ外になるとMyClassが削除されるという問題が引き続き発生します。