5

時折、ほんの一瞬ですが、auto_ptr はクールだと思います。しかし、ほとんどの場合、それを無関係にするもっと単純なテクニックがあることを私は認識しています. たとえば、例外がスローされた場合でも、オブジェクトを自動的に解放したい場合は、オブジェクトを新しく作成して auto_ptr に割り当てることができます。とてもかっこいい!しかし、もっと簡単に自分のオブジェクトをローカル変数として作成し、スタックに任せることもできたはずです (当たり前!)。

したがって、auto_ptr の使用を禁止しているGoogle C++ コーディング標準を見つけたとき、私はそれほど驚きませんでした。Google は、代わりに scoped_ptr を使用する必要があると述べています (スマート ポインターが必要な場合)。

私の経験に反して、誰かが auto_ptr を使用するのに最適または最も簡単なものであるという確固たる理由を教えてくれるかどうか知りたいです。そうでない場合は、自分で使用することを禁止すると思います(Googleのリードに従って)。

更新:懸念を表明した人のために、いいえ、私はGoogle標準を採用していません. たとえば、Google のアドバイスに反して、例外処理を有効にすることに同意します。また、私が作成した印刷可能な列挙型などのプリプロセッサ マクロを使用することも好きです。私を驚かせたのは auto_ptr トピックです。

update2 : 私の回答は、以下の 2 つのレスポンダーとWikipedia からのメモから得られたものであることがわかりました。まず、Herb Sutter は有効な使用方法を示しました (ソース シンク イディオムとライフタイム リンク オブジェクト構成)。第二に、TR1 とブーストが利用できないか禁止されており、C++03 のみが許可されているショップがあります。第 3 に、ウィキペディアによると、C++0x 仕様は auto_ptr を廃止し、unique_ptr に置き換えています。したがって、私の答えは次のとおりです。(考慮しているすべてのプラットフォームで)使用できる場合は unique_ptr を使用し、それ以外の場合は、Sutter が示すケースに auto_ptr を使用します。

4

6 に答える 6

7

スコープ付きまたは一意のポインターが必要であり、tr1 実装またはブーストにアクセスできない厳密な C++03 環境で作業している場合に使用するのが最も簡単です。

于 2011-01-26T07:56:19.337 に答える
7

Herb Sutter がこれを手伝ってくれます: http://www.drdobbs.com/184403837

于 2011-01-26T07:53:38.890 に答える
6

禁止auto_ptrは魅力的なようですが、1つの問題があります。

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

プレースホルダーを何に置き換えsome_smart_ptrますか?

一般的な答えはshared_ptr、所有権が本当に共有されている場合にのみ価値があります。関数が呼び出し元にリソースの排他的所有権を付与する場合、それはせいぜい誤解を招く可能性があります(そして私に関する限り、時期尚早の悲観化の典型的なケース)。

一方、C ++ 03では、他の形式のスマートポインターは提供できません。移動セマンティクスがなければ、ここで必要なものを提供することは不可能です。auto_ptrまたは、ネイキッドポインタが2つの論理的な候補です。しかし、発信者が不注意である場合、裸のポインタはリークのリスクにさらされます。

C ++ 0xを使用すると、あらゆる状況でunique_ptr有利に置き換えられます。auto_ptr

于 2011-01-26T09:24:17.500 に答える
3

std::auto_ptrポインターのセマンティクスはまだあるため、自動 (非ポインター) 変数は代わりになりません。特に、std::auto_ptrポリモーフィズムと再割り当てをサポートします。スタック変数を使用すると、ポリモーフィズムのために参照を使用できますが、参照では再割り当てができません。

std::auto_ptrうまくいくこともあります。たとえば、にきびを実装する場合。確かに、ほとんどの場合、boost のスマート ポインター ライブラリはスマート ポインターのより良い選択肢を提供します。しかし、現在std::auto_ptrは標準的なソリューションですが、boost のスマート ポインターはそうではありません。

于 2011-01-26T07:54:38.623 に答える
2

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

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

于 2011-01-26T08:46:43.967 に答える
1

その理由の 1 つは、それscoped_ptrはコピーできないため、より安全に使用でき、間違いを犯しにくいということです。所有権の譲渡を許可します(たとえば、コンストラクターパラメーターとしてauto_ptr別のものを渡すことにより)。auto_ptr所有権の譲渡などを考える必要がある場合は、 のようなスマート ポインターを使用したほうがよいでしょうshared_ptr

于 2011-01-26T07:52:05.150 に答える