JossutisのSTL本からのauto_ptrに関する説明を読んだ後、auto_ptrの多くの落とし穴の1つが原因で、それを使用しようとすると100%失敗するという強い印象を受けました。
私の質問は、auto_ptrが本当に便利で、そこにうまく適合する実際のタスクはありますか?
JossutisのSTL本からのauto_ptrに関する説明を読んだ後、auto_ptrの多くの落とし穴の1つが原因で、それを使用しようとすると100%失敗するという強い印象を受けました。
私の質問は、auto_ptrが本当に便利で、そこにうまく適合する実際のタスクはありますか?
明らかに、auto_ptr
に対して負けunique_ptr
ます。
さて、「ブーストなしの厳密な C++03」の世界では、私はauto_ptr
かなり頻繁に使用します。
std::auto_ptr
があることを戻り値の型で明示的に使用するという事実が好きですrelease()
場合にのみstd::map<>::insert
返すためconst std::auto_ptr
ことを明確にするのが好きです。使用できると思いますが、最良の選択肢ではありません。
まず、それは 1 年以内の問題であり、auto_ptr
公式には非推奨です。次に、優れた代替手段がありますunique_ptr
。Stroustrup 博士はかつて次のように述べていunique_ptr
ます。
「auto_ptr はどうあるべきか」(ただし、C++98 では記述できませんでした)
したがって、選択肢がない限りauto_ptr
、良い選択ではありません。主な理由は、最近のほとんどの C++ コンパイラが を実装move semantics
して提供しているためunique_ptr
です。
ヒープ割り当てオブジェクトを一時的に制御する必要がある単純なシナリオでは、auto_ptr
問題なく使用できます。たとえば、1 つの関数内でのみ使用されるオブジェクトを条件付きで作成する必要がある場合、それをスタックに割り当てることはできずauto_ptr
、例外が発生した場合にオブジェクトの有効期間を気にする必要がなくなります。
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)
編集:参照を記録することを明確にしました。