如何删除属于存储在向量中的对象的指针



我有一个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());

该对象的dataptr将被自动删除。

使用智能指针

使用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_ptrshared_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;
}

最新更新