gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:52:42 27 4
gpt4 key购买 nike

考虑以下几点:

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

如果 vector 中发生重新分配,并且失败(抛出 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,因此将不会发生依赖于 delete 指针的析构函数行为。 (这可能表明应该禁止 emplace_back 用于 unique_ptrs 的容器)

最佳答案

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

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

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

关于c++ - 将 emplace_back 与 unique_ptrs 容器一起使用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13172888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com