考虑以下:
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
如果在向量中发生重新分配,并且失败(抛出 std::bad_alloc
),我是"safe"还是会泄漏 int
?
C 11 23.3.6.5 [vector.modifiers] / 1说:
如果除了复制构造函数之外抛出异常,移动构造函数,赋值运算符或T的移动赋值运算符,或者通过任何InputIterator操作都没有效果 .
这似乎表明这是一个潜在的问题 . 也就是说,如果有"no effects",则没有构造 unique_ptr
,因此析构函数的行为将依赖于 delete
指针不会发生 . (这可能表明 emplace_back
应该被禁止 unique_ptr
的容器)
1 回答
如果需要重新分配并且失败,那么是的,您的对象永远不会进入容器,因此将丢失 .
但是,应该注意这是纯粹的用户错误 . 对于
unique_ptr
的容器,emplace_back
不应该是"banned",因为有完全安全的方法(例如事先reserve
这个空间,所以你知道它总会在那里) . 此外,您可以传入整个unique_ptr
,因为它完全能够使用移动构造函数 .实际上,在你可以抛出异常的点之前没有正确地将非RAII对象(
int*
)包装在RAII对象中是你的错 .