2011-01-26 9 views
5

時折、一瞬の瞬間に、私はauto_ptrが涼しいと思う。しかし、ほとんどの時間私はそれが無関係にするはるかに簡単なテクニックがあることを認識します。たとえば、オブジェクトが自動的に解放されるようにするには、例外がスローされても、オブジェクトを新規に作成してauto_ptrに割り当てることができます。とてもかっこいい!しかし、より簡単に私のオブジェクトをローカル変数として作成し、スタックがそれを世話できるようにすることができました。let's go of auto_ptr

このように、私はgoogle C++ coding standardsがauto_ptrの使用を禁止しているのを見たときに驚きませんでした。 Googleでは、代わりにscoped_ptrを使用する必要があると述べています(スマートポインタが必要な場合)。

私の経験とは逆に、auto_ptrがであるか、またはのものを使用しているかの確かな理由があるかどうかを知りたいですか?もしそうでなければ、私はそれを自分で使うことを禁止すると思う。

アップデート:懸念を表明した人のために、私はGoogle標準を採用していません。たとえば、Googleのアドバイスに対して、私は例外処理を有効にする必要があることに同意します。また、私が作成したprintable enumのようなプリプロセッサマクロの使用も好きです。それは私を打つauto_ptrの話題です。

update2:私の答えは、以下のレスポンダのうちの2人であり、note from Wikipediaです。最初に、Herb Sutterは有効な使い方を示しました(ソースシンクのイディオムと生涯リンクされたオブジェクトの構成)。第二に、TR1とブーストが利用できない、または禁止されている店があり、C++ 03のみが許可されています。第3に、Wikipediaによると、C++ 0x仕様はauto_ptrを非難し、それをunique_ptrに置き換えています。ですから、私の答えは:Sutterが描いているケースに対してauto_ptrを使ってください。

+3

Googleのスタイルガイドも禁止しています。誰かが間違ってしまい、Googleのスタイルガイドがそれらを禁止するので、例外を禁止するのだろうか? No. – sharptooth

+3

はGoogleのガイドラインに準拠していません。一般的に、それらは固有のものであり、巨大なCコードベースとの統合が必要です。 (ただし、 'auto_ptr'を使わない理由はたくさんあります)。もし可能ならば –

答えて

7

スコープまたは一意のポインタが必要なときに、tr1実装またはブーストにアクセスできない厳格なC++ 03環境で作業するのが最も簡単です。

+0

+100 –

1

よくある理由は、scoped_ptrはコピー不可能なので、使用するのがより安全で、間違いを起こすのはより難しいでしょう。 auto_ptrは、オーナーシップの転送を可能にする(例えば、コンストラクタパラメータとして別のauto_ptrを渡すことによって)。あなたが所有権を移すようなことを考える必要がある場合は、shared_ptrのようなスマートなポインタを使う方が良いでしょう。

3

std::auto_ptrはまだそれほど自動(非ポインタ)の変数が代わるものではありません、ポインタの意味を持っています。特に、std::auto_ptrは多型性および再割り当てをサポートします。スタック変数を使用すると、多態性の参照を使用できますが、参照では再割り当てができません。

ときどきstd::auto_ptrはうまくいくでしょう。例えば、pimplを実装するため。確かに、大多数のケースでは、スマートポインタライブラリは、スマートポインタのより良い選択肢を提供します。しかし今はstd::auto_ptrが標準的な解決策ですが、ブーストのスマートポインタはそうではありません。

2

auto_ptrを関数の戻り値として使用すると、copiyngのオーバーヘッドがなくなり、メモリリークは発生しません。 std::auto_ptr<obj> foo(){ foo(); }で安全に呼び出すことができますが、obj *foo()ではできません。 boost :: shared_ptrはこれを解決できますが、オーバーヘッドは高くなります。

また、メモリの制約のためにスタック上にオブジェクトを作成できない場合があります。スレッドスタックは比較的小さいためです。しかし、boost :: scoped_ptrは誤って解放されることはないので、この場合はより良いでしょう。

6

auto_ptrを禁止しながら、魅力ようだが、一つの問題があります:

template <typename T> 
some_smart_ptr<T> create(); 

あなたとsome_smart_ptrプレースホルダを置き換えますか?

一般的な回答shared_ptrは、所有者が本当に共有されている場合にのみ価値があります。呼び出し元にリソースの排他的所有権が与えられていれば、それは最高の誤解を招きます(そして、心配している)。

一方、C++ 03では、スマートポインタの他の形式は提供できません。移動セマンティクスを使用することは不可能です。私たちがここで希望するものを提供することは不可能です。 auto_ptrまたは裸のポインタは、2つの論理的な競合相手です。しかし、呼び出し元が不注意な場合は、裸のポインタがリークのリスクにさらされます。

C++ 0xの場合、unique_ptrは都合の良い場合にはauto_ptrを置き換えます。