2

このアプローチは安全ではありませんか?

#include <tr1/memory>

Foo * createFoo()
{
  return new Foo(5);
}

int main()
{
  std::tr1::shared_ptr<Foo> bar(create());

  return 0;
}

それとも、オブジェクトcreateFooを返すことが望ましいでしょうか?shared_ptr<Foo>

4

2 に答える 2

3

あなたの例は、あなたが書いた方法で安全です。createFoo()ただし、ファクトリ メソッドが生のポインターの代わりに自動ポインターを返すようにすることで、さらに漏れを防ぐことができます。そうすれば、漏れがないことが保証されます。

したがって、得られるものは次のとおりです。

#include <memory>
#include <tr1/memory>

std::auto_ptr<Foo> createFoo()
{
  return std::auto_ptr<Foo>(new Foo(5));
}

int main()
{
  std::tr1::shared_ptr<Foo> bar(createFoo());

  return 0;
}

もちろん、ファクトリ メソッドが shared_ptr を返すようにすることも可能ですが、返されたポインタは代入またはコンストラクタで使用されるため、通常はすぐに範囲外になるため、これはやり過ぎと見なされる可能性があります。さらに、auto_ptr を使用すると、ポインターの使用目的がより明確に示されます。これは、コードに慣れていない人がそれを理解しなければならない場合に常にプラスになります。

于 2011-04-07T21:00:58.043 に答える
2

この例は安全です。shared_ptrコンストラクターが例外をスローする場合、それはスローするdelete前のポインター引数です (ドラフト標準、20.9.11.2.1)。

createを返すかどうかはshared_ptr、クライアントがその結果に対して合理的に何をしたいかによって異なります。でラップするだけの場合は、shared_ptr安全性を高めるためにそれを返します。(はい、shared_ptrいくつかのカップリングを導入する可能性があります。)

于 2011-04-07T20:49:49.587 に答える