我有一个Containing类、一个Containerd类和一个Data类。Containing类包含Containerd对象的向量。Containerd类持有一个指向数据对象的指针,该指针在Containerd的构造函数中的堆上分配。然而,我无法在析构函数中解除分配它,因为向量将创建Containerd的副本,然后销毁它们,从而销毁数据指针,即使在我们使用的副本中也是如此。
TL;DR这里有一些代码需要解释:
class Data {
public:
Data();
};
class Contained {
private:
Data* data;
public:
Contained();
// what should I add ? a copy constructor ? an assignement operator ? and how
};
class Container {
private:
vector<Contained> rooms;
public:
//some member functions
};
Contained::Contained() {
data = new Data();
}
在哪里删除数据
使用RAII(资源获取即初始化(
向Contained
类添加析构函数:
Contained::~Contained() {
delete data;
}
这将确保每当包含的对象超出范围时,它都会自动删除它所拥有的data
指针。所以如果你做
//delete first element
rooms.erase(rooms.begin());
该对象的data
ptr将被自动删除。
使用智能指针
使用std::unique_ptr<T>
。
class Contained {
private:
std::unique_ptr<Data> data;
public:
Contained();
// what should I add ? a copy constructor ? an assignement operator ? and how
};
在构造函数中:
Contained::Contained() {
data = std::make_unique<Data>();
}
使用智能指针,即(unique_ptr
,shared_ptr
(可确保指针在无人拥有时自动删除。由于不能复制unique_ptr
,只能移动它,因此应在Contained
类上定义移动构造函数和移动赋值运算符。
Contained::Contained(Contained&& other)
: data(std::move(other.data))
{}
Contained& operator=(Contained&& rhs) {
if (this != &other) {
data = std::move(rhs.data);
}
return *this;
}