2016-10-29 4 views
14

でセマンティクスを周りにコピーしましょう特にデストラクタでクリーンアップが行われている場合は、実行時エラーが発生する可能性があります。私は通常、この問題を回避したいの方法は、だけではなく、ポインタのベクトルを作成することです:は、このコードを考えてみてくださいC++

std::vector<A*> test; 
test.push_back(new A()); 

私の質問は2倍で、この一般的な方法であると、それは良い方法ですか?それとも良い方法がありますか? これが詐欺であると判明した場合は、私に知らせてください。私は質問を終わらせますが、検索で何も見つかりませんでした。

+7

ポインタを使用しない*使用*の方法が一般的です。ポインタを使うのは良い習慣です。そして、あなたがポインタを使用せずに*動き*コンストラクタを実装した方がよいでしょう。 –

+0

でも、リストに多型が必要な場合(そしてBが基本クラスの場合)、 'std :: vector test'が必要です。しかし、ここだけ...そして私はそれがメモリリーク/ダブルフリーには悪いことに同意します。 –

+0

より良い方法は、 'B'の移動コンストラクタを実装することです。 –

答えて

24

emplace_backを使用してください。

std::vector<A> test; 
test.emplace_back(); 
//test.emplace_back(constructor, parameters); 

このように、Aは、その場で構築されるため、コピーや移動は行われません。

編集:質問のコメントを明確にする - いいえ、これは一時的に渡すとpush_backから変更されません。例えば、

test.emplace_back(A{}); 

ウィル、C++ 11には、一時的なAは、構築に移動して、あなたが push_backを使用しているかのように破壊することになり。

関連する問題