15

JossutisのSTL本からのauto_ptrに関する説明を読んだ後、auto_ptrの多くの落とし穴の1つが原因で、それを使用しようとすると100%失敗するという強い印象を受けました。

私の質問は、auto_ptrが本当に便利で、そこにうまく適合する実際のタスクはありますか?

4

4 に答える 4

14

明らかに、auto_ptrに対して負けunique_ptrます。

さて、「ブーストなしの厳密な C++03」の世界では、私はauto_ptrかなり頻繁に使用します。

  • 特定の型の動的に割り当てられたインスタンスを返す「ファクトリメンバー関数」の場合:オブジェクトを削除する必要std::auto_ptrがあることを戻り値の型で明示的に使用するという事実が好きです
  • 後でコンテナにオブジェクトを挿入しようとする前にオブジェクトを割り当てる関数: たとえば、その挿入が成功したrelease()場合にのみstd::map<>::insert返すため
  • メッセージ キューから要素をポップするスレッド プロシージャでは、ポップされた要素を に格納して、メッセージ何があっても破棄されるconst std::auto_ptrことを明確にするのが好きです。
于 2010-12-29T12:55:53.237 に答える
5

使用できると思いますが、最良の選択肢ではありません。

まず、それは 1 年以内の問題であり、auto_ptr公式には非推奨です。次に、優れた代替手段がありますunique_ptrStroustrup 博士はかつて次のように述べていunique_ptrます。

「auto_ptr はどうあるべきか」(ただし、C++98 では記述できませんでした)

したがって、選択肢がない限りauto_ptr、良い選択ではありません。主な理由は、最近のほとんどの C++ コンパイラが を実装move semanticsして提供しているためunique_ptrです。

于 2010-12-29T12:45:21.510 に答える
2

ヒープ割り当てオブジェクトを一時的に制御する必要がある単純なシナリオでは、auto_ptr問題なく使用できます。たとえば、1 つの関数内でのみ使用されるオブジェクトを条件付きで作成する必要がある場合、それをスタックに割り当てることはできずauto_ptr、例外が発生した場合にオブジェクトの有効期間を気にする必要がなくなります。

于 2010-12-29T12:43:13.703 に答える
1

std::auto_ptr例外の安全性を確保するために、適度に頻繁に使用します。つまり、メソッドの一部で例外がスローされた場合のメモリ リークを防ぐためです。

例えば:

Foo &Container::addFoo(
   const std::string &name
   )
{
  // The post conditions of the method require that the new Foo
  // has been added to this container, but the addition method
  // may throw exceptiona
  std::auto_ptr< Foo > foo(new Foo(name));

  foo->twiddle();// may throw
  this->addFoo(*foo);// record reference. May throw

  return *foo.release();
}

this->addFoo(*foo)編集:参照を記録することを明確にしました。

于 2010-12-29T12:52:39.153 に答える