Я определил следующий класс, который создает и освобождает непрозрачный объект (например, дескриптор операционной системы)
class A
{
public:
A(...)
{
allocateHandle(&h);
}
~A()
{
freeHandle(h);
}
SomeHandle h;
}
При создании и изменении размера std :: vector of A программа вылетает.
std::vector<A> vec;
vec.reserve(2);
vec.emplace_back(...);
vec.emplace_back(...);
vec.emplace_back(...); //crash
Когда std :: vector перераспределяет память, он вызывает конструктор перемещения для всех объектов, таким образом, также перемещая дескриптор в A (который в основном является целым числом).
Однако он также вызываетдеструктор на старом объекте, который вызывает freeHandle()
, таким образом он освобождает память за дескриптором, что новый объект все еще имеет, который становится недействительным и вызывает сбой.
Как мне реализовать move-конструктор, чтобы вновь созданный объект не становился недействительным при удалении старого?