我发现(感谢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;
}
基本上,如果
emplace_back
抛出异常,使用原始的new
为Item
分配内存可能会导致内存泄漏。解决方案是从不使用原始的
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
是无效的,因为我必须使用std::move
移动item
以将其放置到items
容器中。
我想不出需要在额外变量中存储item
地址的解决方案。然而,原始(有缺陷的)解决方案非常简洁易读。
是否有更优雅的方法返回已移动以用于容器插入的std::unique_ptr
?
items
向量突然消失了呢? - Joker_vDemplace_back
抛出异常,参数将已经被移动。 - avakarconst
时才会有问题。 - Joker_vD