【发布时间】:2012-10-21 19:02:17
【问题描述】:
考虑以下几点:
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 的容器)
【问题讨论】:
-
好点。这启发了我完全放弃使用
new转而使用std::make_unique,这样我就可以从一开始就知道每个分配都以智能指针结束。 -
我在评论中注意到了这个陷阱:stackoverflow.com/questions/3283778/…
标签: c++ emplace exception-safety