请考虑以下事项:
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
答案 0 :(得分:19)
如果需要重新分配并且失败,那么是的,您的对象永远不会进入容器,因此会丢失。
但是,应该注意这是纯粹的用户错误。对于emplace_back
的容器,unique_ptr
不应该被“禁止”,因为有完全安全的方法(例如预先reserve
空间,所以你知道它总会在那里)。此外,您可以传入整个unique_ptr
,因为它完全能够使用移动构造函数。
实际上,在你可以抛出异常的点之前没有正确地将非RAII对象(int*
)包装在RAII对象中是你的错。