【发布时间】:2016-03-10 03:07:33
【问题描述】:
struct foo{
int* i;
foo(): i(new int(42)){}
foo(const foo&) = delete;
foo(foo&&) = default;
~foo(){
std::cout << "destructor: i" << std::endl;
delete(i);
}
};
int main()
{
foo f;
auto sp_f = std::make_shared<foo>(std::move(f));
}
这很糟糕,因为似乎f 的析构函数一旦移入shared_ptr 就会被调用。 shared_ptr 会有一个已删除的指针,超出作用域后会删除,也就是说指针会被删除两次。
如何避免这个问题?
【问题讨论】:
-
不要默认移动构造函数?
-
是的,实际上定义了移动 ctor 和交换指针,例如或者干脆使用已经为它定义了移动语义的东西,比如
std::unique_ptr。 -
而不是原始数组,只需使用
std::vector。那里。一切都好。在 C++ 中管理资源的关键是使用标准资源管理器。至少尽可能。 -
@Cheersandhth.-Alf 我在这里看不到原始数组。
-
在这种情况下,您可以只使用
unique_ptr<int> i和零规则。如果资源需要其他发布代码,您还可以将unique_ptr与自定义删除器一起使用。避免重新发明轮子是件好事!
标签: c++ move c++14 move-semantics