c – 使用具有unique_ptrs容器的emplace_back可以安全吗?

考虑以下几点:

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

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

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

If an exception is thrown other than by the copy constructor, move constructor, assignment operator, or move assignment operator of T or by any InputIterator operation there are no effects.

这似乎表明这是一个潜在的问题。也就是说,如果有“没有效果”,那么没有构建unique_ptr,因此,依赖于删除该指针的析构函数不会发生。 (这可能表示对于unique_ptrs的容器应该禁止emplace_back)

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

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

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

http://stackoverflow.com/questions/13172888/is-it-safe-to-use-emplace-back-with-a-container-of-unique-ptrs

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 使用具有unique_ptrs容器的emplace_back可以安全吗?