2016-10-20 12 views
1

std::vectorFooオブジェクトを追加したいが、テンポラリオブジェクトが有効範囲外になったらFoo::~Foo()を呼び出すため、一時オブジェクトを作成してベクターに追加したくない。 newを使用してベクトルストアFooポインタを作成する必要がありますか、別の方法がありますか?デストラクタを呼び出さずにリストにオブジェクトを追加

私ははしたくない何:

void FooHandler::AddFoo(int a, int b, int c) { 
    Foo foo(a, b, c); 
    vectorOfFoos.push_back(foo); 
} //foo goes out of scope so Foo::~Foo() is called 

は、これらの仕事はしませんか?

//Foo has an implicit constructor which takes a FooSettings object 
struct FooSettings { 
public: 
    int a; 
    int b; 
    int c; 
}; 

void FooHandler::AddFoo(int a, int b, int c) { 
    vectorOfFoos.push_back(Foo(a, b, c)); 
} //is Foo::~Foo() called here? 

void FooHandler::AddFoo(FooSettings settings) { 
    vectorOfFoos.push_back(settings); 
} //is Foo::~Foo() called here? 
+0

なぜ、Fooのデストラクタを呼びたくないのですか? –

+0

@ChrisDrew 'Foo'は実際にはCライブラリのいくつかの関数のラッパーです。 'Foo :: Foo()'コンストラクタはこのライブラリの関数を使用して動的ポインタを作成し、 'Foo ::〜Foo()'デストラクタはそのポインタをクリーンアップします。したがって、 'Foo'インスタンスの任意のコピーからデストラクタを呼び出すと、動的ポインタが削除されます。 – Tagglink

+1

'Foo'のコピーコンストラクタのように聞こえる@Tagglinkが壊れています。コピーを破棄しても、通常は別のオブジェクトの一部のリソースが削除されるべきではありません。手動でリソースを管理するのではなく、 'std :: unique_ptr'を使うことをお勧めします。 – TartanLlama

答えて

2

いずれの解決策も、一時的な作成を伴います。 push_backの代わりにemplace_backを使用して、Fooインスタンスをベクターにコピーするのではなく、その場で構築することができます。

void FooHandler::AddFoo(int a, int b, int c) { 
    vectorOfFoos.emplace_back(a,b,c); 
} 
関連する問題