( StackOverflow コメントのおかげで) コードにセキュリティ上の欠陥があることがわかりました。
std::vector<std::unique_ptr<Item>> items;
template<class... TS> Item& create(TS&&... mArgs)
{
auto item(new Item(std::forward<TS>(mArgs)...);
items.emplace_back(item); // Possible exception and memory leak
return *item;
}
基本的にItem
、raw で を割り当てると、throwのnew
場合にメモリ リークが発生する可能性がありますemplace_back
。
解決策は raw を使用することはありませんが、メソッド本体で権利new
を使用しています。std::unique_ptr
std::vector<std::unique_ptr<Item>> items;
template<class... TS> Item& create(TS&&... mArgs)
{
auto item(std::make_unique<Item>(std::forward<TS>(mArgs)...);
items.emplace_back(std::move(item));
return *item; // `item` was moved, this is invalid!
}
ご覧のとおり、コンテナーに配置するために使用しitem
て移動する必要があったため、返すことは無効です。item
std::move
items
item
のアドレスを追加の変数に格納する必要がある解決策は考えられません。ただし、元の(バグのある)ソリューションは非常に簡潔で読みやすいです。
std::unique_ptr
コンテナに定置するために移動されたを返すよりエレガントな方法はありますか?