【发布时间】:2019-03-28 08:41:24
【问题描述】:
我最近正在处理一些使用std::unique_ptr<T> 的std::vector 和std::function<void(T*)> 类型的自定义删除器的代码。该代码正在尝试从向量中删除满足特定条件的值:
size_t j = 0;
for (size_t i = 0; i < vec.size(); i++) {
if (!condition(vec[i].get()) {
vec[j] = std::move(out[i]);
j++;
}
}
vec.resize(j);
在对vec 的析构函数抛出的bad_function_call 进行故障排除时,我发现当i=j 和unique_ptr 与自身一起移动构造时,它会丢失其自定义删除器。换句话说,vec[j] 仍将指向正确的值,但其删除器将是默认构造的 std::function。
为什么会这样?这段代码违反了什么规则?
FWIW,我只能通过 clang 实现它,并且只能在某些平台上实现。为i=j 添加一个守卫可以解决这个问题。
MCVE:
#include <memory>
#include <vector>
#include <functional>
using int_ptr= std::unique_ptr<int, std::function<void(int*)>>;
int_ptr make_int_ptr(int val) {
auto deleter = [](int* q) { delete q; };
int* v = new int;
*v = val;
return int_ptr{v, deleter};
}
int main() {
auto a = make_int_ptr(4);
a = std::move(a);
}
【问题讨论】:
标签: c++ c++11 unique-ptr clang++ std-function