0

私たちの大規模なプロジェクトでは、次のような多くのクラスがありますtypedef

class Foo
{
  public:
    typedef std::auto_ptr<Foo> Ptr;
    typedef boost::shared_ptr<Foo> Ref;
  ...
};
...
Foo::Ref foo(new Foo);
...
doBar(foo);
...

それらの使用は非常に便利です。しかし、auto_ptr意味的に ref に近く、ref と同じかどうかはPtr疑問shared_ptrです。またはauto_ptr、「所有権の譲渡」セマンティクスがあるため、明示的に使用する必要がありますか?

ありがとう、

4

5 に答える 5

2

std::auto_ptr所有権移転のセマンティクスがありますが、かなり壊れています。を使用できる場合は、期待どおりの動作をするため、代わりに をboost::shared_ptr使用する必要があります。所有権を譲渡し、以前のインスタンスを無効にしますが、そうではありません。boost::unique_ptrstd::auto_ptrstd::auto_ptr

さらに良いことに、C++11 を使用できるstd::unique_ptr場合は、 と に交換しstd::shared_ptrます。

于 2012-01-31T08:32:37.240 に答える
1

を使用しないでくださいstd::auto_ptr。非推奨であり、危険であると考えていますPtr。 .

Refを呼び出す意味はないと思います。shared_ptrこの場合は以上Ptrですauto_ptr

編集:簡単に誤用できるため、危険だと考えています。その仕組みを完全に理解していても、特に typedef の背後に隠している場合は、誤って誤用する可能性があります。優れたクラスは、正しく使いやすく、誤用しにくいものでなければなりません。特に の出現により、 のunique_ptr有用なシナリオが見当たりませんauto_ptr

于 2012-01-31T08:33:16.887 に答える
0

auto_ptrC++11 では非推奨です。使用をやめて、shared_ptr. の場合shared_ptr、割り当て時に所有権の譲渡はなく、オブジェクトへの参照の数がカウントされ、最後のポインターが破棄されるとオブジェクトが破棄されます。

于 2012-01-31T08:32:48.857 に答える
0

この順序は、誰かが使用した命名法にすぎないと思います。次の理由により 、 forおよびforである
必要があります。refauto_ptrptrshared_ptr

参照は不変であるため、他のオブジェクトを参照することはできません。auto_ptr同様の(リモートで似ていますが)セマンティクス、所有権の譲渡があります。つまり、それが示す非直感的な動作に auto_ptr を割り当てたくないでしょう。割り当てられたオブジェクトは所有権を取得し、割り当てられているオブジェクトは所有権を失います。

一方shared_ptr、同じオブジェクトを指すことができる複数のポインターに(再びリモートで)類似する参照カウントメカニズムがあります。ポインターの所有権はshared_ptrそれ自体にあり、それを参照するポインター インスタンスがなくなるとすぐに割り当てが解除されます。

于 2012-01-31T08:33:04.680 に答える
0

多くは、それらが何に使用されているかに依存します。そして の場合、 Refそれによって人々が理解すること。Ptr標準化前の時代には、(侵襲的な) 参照カウント ポインターにtypedef を使用することがよくありました。実際、そのような typedef の存在は、型が参照カウントをサポートしていること、および常に動的に割り当てられる必要があることを示していました。

std::auto_ptrとは両方ともboost::shared_ptr非常に特殊なセマンティクスを持っています。特殊なセマンティクスのため、および (侵襲的な参照カウント ポインターの場合とは異なり) 指す型から完全に独立しているため、私はそれらに typedef を使用しない傾向があります。任意の型について、プログラム ロジックの必要に応じて、それらを使用することも使用しないこともできます。(その特定のセマンティクスのために、かなりの数の の使用を見つけましたstd::auto_ptr。しかし、避ける傾向がありますboost::shared_ptr。かなり危険です。)

于 2012-01-31T08:35:48.647 に答える