【发布时间】:2019-05-22 09:29:34
【问题描述】:
我已经定义了以下类,女巫创建并释放一个不透明的对象(例如操作系统句柄)
class A
{
public:
A(...)
{
allocateHandle(&h);
}
~A()
{
freeHandle(h);
}
SomeHandle h;
}
在创建和调整 A 的 std::vector 大小时,程序崩溃。
std::vector<A> vec;
vec.reserve(2);
vec.emplace_back(...);
vec.emplace_back(...);
vec.emplace_back(...); //crash
当 std::vector 重新分配内存时,它会调用所有对象的移动构造函数,从而也移动 A 中的句柄(基本上是一个整数)。
但是,它也调用了旧对象的析构函数,调用freeHandle(),因此它释放了句柄后面的内存,新对象仍然拥有,这变得无效并导致崩溃。
我应该如何实现move-constructor,这样新创建的对象在删除旧对象时不会变得无效?
【问题讨论】:
标签: c++ c++11 vector move-constructor