2009-04-29 4 views
1

私はauto_ptrをしている場合は、私は同様の参照のためにそれを渡すことができます:?参照とauto_ptrを

auto_ptr<MyClass>Class(new MyClass); 
void SetOponent(MyClass& oponent); 
//So I pass SetOponent(Class) 

をそしてauto_ptrsの奇数コピー行動は何ですか?

+0

なぜこれがコミュニティウィキなのかよくわかりません... –

+0

Doug、なぜそうではないo_O –

答えて

4

んが、あなたができない、あなたがそれを間接参照しなければならない:コピーの挙動については

SetOponent(* Class) 

を、私はそのようなスコット・マイヤーズ効果的なC++のように、あなたがC++に良い本を読むことをお勧めしますしません。 auto_ptrのコピー動作は非常に直感的ではなく、おそらくSO答えの範囲を超えています。しかし、何も冒険していません...

auto_ptrがコピーされると、所有権はオリジナルからコピーに転送されます。たとえば、

この時点で、p1はFooオブジェクトへのポインタを所有しています。

auto_ptr <Foo> p2(p1); 

は、コピーした後、p2はポインタを所有し、それが今でNULLポインタを保持しているように、p1がに変更されます。コピーはC++の多くの場所で行われるため、これは重要です。たとえば、auto_ptrsを値に渡して関数に渡したり、標準のライブラリコンテナに格納しようとしたりしないでください。

+2

ポインタの所有権を関数に渡したい場合は、auto_ptrを関数に渡すことができます。 – markh44

1

奇数コピーの動作では、コピーを作成することはできませんが、元のままです。それにはshared_ptr(boost :: or std :: tr1::)を使用してください。つまり、とりわけauto_ptrsのSTLコンテナを持つことはできません。 auto_ptr<>は、オブジェクトのコピーが1つしかなく、寿命が限られている場合に非常に便利です。別のauto_ptr<>にコピーすると、最初のものが失われます。ポインタを渡すと、すでに削除されているオブジェクトを使用しようとする素晴らしい機会になります。

ご希望の場合は、SetOponent(*Class);に電話することができます。実際のアイテム(ポインタではなくオブジェクトを参照に渡します)を渡すことができます。ポインタに渡すとSetOpponent(Class.get())と呼ぶことができます。 Classがスコープ外になったときにMyClassが削除されるという問題があります。

+0

auto_ptr <>の主な理由を説明していません。それは所有権を渡すことです。これは、オブジェクトの所有権を別のエンティティに移す明示的な方法(したがって、暗黙的に自己文書化)です。 –

+0

私が知る限り、主な理由は、割り当てられたものが削除されることを保証することです。所有権を指定しますが、ほとんどのオブジェクトは所有権を移転しません。私の経験(典型的ではないかもしれません)では、auto_ptrsはコピーされません。 –

+0

私の経験では、auto_ptr <>の使用法は、動的に割り当てられたオブジェクトの所有者を作成者から他のエンティティに明示的に移すためのメカニズムを提供することです。エンティティが受け入れるなら、オブジェクトが割り当てられていなければ所有権を取ります。 –