【发布时间】:2020-07-17 17:43:16
【问题描述】:
将std::unique_ptr 使用std::make_unique() 插入std::set 的最佳方法是什么? insert() 和 emplace() 都可以,但哪个更好?
【问题讨论】:
-
对于
std::unique_ptr这样的类型并不重要。由于您在插入之前创建了std::unique_ptr,因此insert()和emplace()都必须为std::set构造一个新的std::unique_ptr以将您的std::unique_ptr保存并移动到其中。如果您的std::set持有实际对象而不是指向对象的指针,那么emplace()'ing 一个新对象将比insert()'ing 一个临时对象“更好”,但对于移动语义,差异往往可以忽略不计。 -
我要构造
unique_ptr"inline" 的插入。 -
您可以使用
emplace()进行“内联”构造,但这意味着如果您想避免构造和传入临时std::unique_ptr来转移所有权,则必须改为传入获取所有权的原始指针。这意味着如果emplace()抛出,您将面临内存泄漏的风险。如果使用std::make_unique()作为输入,则指针始终受到保护,使用insert()和emplace()几乎没有区别,所以随便用一个。 -
如果
insert()抛出(而我使用std::make_unique())? -
如果你使用
std::make_unique()作为输入,那么指针始终受到保护,无论你使用insert()还是emplace(),都不存在泄露风险
标签: c++ stl insert unique-ptr stdset