将emplace_back与unique_ptrs容器一起使用是否安全?

时间:2012-11-01 07:40:05

标签: c++ emplace exception-safety

请考虑以下事项:

std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);

如果在向量中发生了重新分配,并且失败了(抛出std::bad_alloc),我是“安全”还是会泄漏int

C ++ 11 23.3.6.5 [vector.modifiers] / 1说:

  

如果除了复制构造函数之外抛出异常,移动构造函数,赋值运算符或移动赋值运算符T或任何InputIterator运算都没有效果。

这似乎表明这是一个潜在的问题。也就是说,如果存在“无效果”,那么就没有构造unique_ptr,因此析构函数的行为将依赖于delete指针不会发生。 (这可能表示emplace_back s容器应禁止unique_ptr

1 个答案:

答案 0 :(得分:19)

如果需要重新分配并且失败,那么是的,您的对象永远不会进入容器,因此会丢失。

但是,应该注意这是纯粹的用户错误。对于emplace_back的容器,unique_ptr不应该被“禁止”,因为有完全安全的方法(例如预先reserve空间,所以你知道它总会在那里)。此外,您可以传入整个unique_ptr,因为它完全能够使用移动构造函数。

实际上,在你可以抛出异常的点之前没有正确地将非RAII对象(int*)包装在RAII对象中是你的错。