2016-08-23 11 views
11

私は、束のオブジェクトを作成し、ポインタを返すファクトリメソッドを持っています。オブジェクトの所有権が発信者に転送されます。ポインタのベクトル(と所有権)を返す方法C++ 11

std::vector<animal*> create_zoo(); 

これは機能しますが、メモリリークが発生しやすくなります。

auto zoo = create_zoo(); 

ベクトルがスタック上にあり、自動的にクリーンアップされますが、含まれているオブジェクトはありません。

さまざまなサブタイプのオブジェクトが返されます。ポインタの代わりに値を保持することはできません。

私は

std::vector<std::unique_ptr<animal> > create_zoo(); 

を使用するように考えていたが、コピー・セマンティクスをunique_ptr持っていないと私は理論的には、コピーを作成し、値によってvectorを返します。

私は

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo(); 

ことを避けるために、ヒープ上vectorを置くことができるが、これはばかげてきています。これは、あまりにも動作するはず

std::vector<std::shared_ptr<animal> > create_zoo(); 

をこれは動作しますが、それは本当に所有権を譲渡しません。呼び出し側は、オブジェクトへの他のポインタがあるかもしれないと仮定しなければなりません。

私は提案があります。 std::vectorである必要はありません。最近のC++でいくつかのオブジェクトの所有権を返すファクトリを実装する良い方法を探しています。私は今、ブーストを避けています。私は新しいC++ 11のものを探そうとしています。

+0

また、動物オブジェクトをポインタとして割り当てる必要があるかどうかを再検討することもできます。 'std :: vector 'もあなたの目的のために動くかもしれません。動物オブジェクトにはベクトルが割り当てられ、移動操作後に動物オブジェクトが移動します。 –

答えて

13

std::vector<std::unique_ptr<animal>>は正常に機能します:関数ローカル値を返すとコピーされません(または移動が利用できない場合のみ)。

+0

Hmm ..それは私のコードがコンパイラの "戻り値の最適化"を実行する能力に依存していることを意味しないでしょうか?私はすべての関連するコンパイラが実装されていることを理解していますが、すべての状況で実際に実行することを実際に保証するかどうかはわかりません。この標準的なプラクティスですか? – Stefan

+6

@Stefanいいえ、それはRVOではありません。 RVOは機能ローカルを完全に削除し、その場所で呼び出し側のものを使用します。これは、RVOがあらかじめ失敗した場合に返される、一時的に返されるオブジェクトを構築する 'return'移動に関するものです。 – Quentin

+2

それは私が行方不明だったビットです! Pythonの6年後にC++に戻ります。私は錆びていて損をしています。この "動き"のものを読みに行く。ありがとう! – Stefan

関連する問題