このアプローチは安全ではありませんか?
#include <tr1/memory>
Foo * createFoo()
{
return new Foo(5);
}
int main()
{
std::tr1::shared_ptr<Foo> bar(create());
return 0;
}
それとも、オブジェクトcreateFoo
を返すことが望ましいでしょうか?shared_ptr<Foo>
このアプローチは安全ではありませんか?
#include <tr1/memory>
Foo * createFoo()
{
return new Foo(5);
}
int main()
{
std::tr1::shared_ptr<Foo> bar(create());
return 0;
}
それとも、オブジェクトcreateFoo
を返すことが望ましいでしょうか?shared_ptr<Foo>
あなたの例は、あなたが書いた方法で安全です。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 を使用すると、ポインターの使用目的がより明確に示されます。これは、コードに慣れていない人がそれを理解しなければならない場合に常にプラスになります。
この例は安全です。shared_ptr
コンストラクターが例外をスローする場合、それはスローするdelete
前のポインター引数です (ドラフト標準、20.9.11.2.1)。
create
を返すかどうかはshared_ptr
、クライアントがその結果に対して合理的に何をしたいかによって異なります。でラップするだけの場合は、shared_ptr
安全性を高めるためにそれを返します。(はい、shared_ptr
いくつかのカップリングを導入する可能性があります。)