[英]Destructor call in a class constructor with a vector
我有以下类,它简单地包装一个数组并使用构造函数向其中添加一些元素:
class myArray {
public:
myArray();
myArray(int a, int b);
myArray(int a, int b, int c);
myArray(myArray&& emplace);
~myArray();
int& operator [](int id);
private:
int *data;
};
myArray::myArray() {
data = new int[1];
data[0] = 0;
}
myArray::myArray(int a, int b) {
data = new int[3];
data[0] = 0;
data[1] = a;
data[2] = b;
}
myArray::myArray(int a, int b, int c) {
data = new int[4];
data[0] = 0;
data[1] = a;
data[2] = b;
data[3] = c;
}
myArray::~myArray() {
std::cout << "Destructor"<<std::endl;
delete[] data;
}
int& myArray::operator [](int id) {
return data[id];
}
myArray::myArray(myArray&& emplace) : data(std::move(emplace.data)) {}
此外,我有第二个类,其中包含第一个类 ( myArray
) 的元素向量。
class Queue {
public:
Queue();
private:
std::vector<myArray> _queue;
};
Queue::Queue {
_queue.reserve(1000);
for(int a = 0; a < 10; a++)
for(int b = 0; b < 10; b++)
for(int c = 0; c < 10; c++)
_queue.emplace_back(a,b,c);
}
我的问题是:为什么在 Queue 构造函数的末尾为 myArray 元素调用析构函数? Queue 对象在我的主程序中仍然存在,但是 myArray 的析构函数释放了分配的内存,因此我得到了一个分段错误。
有没有办法避免调用析构函数,或者直到 Queue 对象生命周期结束时才调用它?
您的移动构造函数不会在移动的对象上将data
设置为 null,因此当移动的对象被破坏时,它将尝试释放数据。
如果你有 c++14,你可以使用std::exchange
来实现:
myArray::myArray(myArray&& emplace)
: data{std::exchange(emplace.data, nullptr)})
{}
否则你需要做:
myArray::myArray(myArray&& emplace)
: data{emplace.data)
{
emplace.data = nullptr;
}
移动构造函数将由std::vector
调用,因为它会在您调用emplace_back
时重新分配以增加其容量。 执行如下步骤:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.