21

考虑以下:

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应该禁止unique_ptrs 的容器)

4

1 回答 1

19

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

但是,应该注意的是,这纯粹是用户错误。emplace_back不应该对 的容器“禁止” unique_ptr,因为有非常安全的方法可以做到这一点(例如reserve事先 ing 空间,所以你知道它会一直存在)。此外,您可以传入整个unique_ptrs,因为它完全能够使用移动构造函数。

int*所以说真的,在可能引发异常的点之前没有正确地将非 RAII 对象 (the ) 包装在 RAII 对象中是你的错。

于 2012-11-01T07:42:27.310 回答