首页 文章

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

提问于
浏览
20

考虑以下:

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 回答

  • 19

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

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

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

相关问题