c++ - 如何删除属于存储在向量中的对象的指针?
问题描述
我有一个包含类、一个包含类和一个数据类。该 Containing 类包含一个 Contained 对象的向量。Contained 类拥有一个指向数据对象的指针,该指针在 Contained 的构造函数中分配在堆上。但是,我不能在析构函数中释放它,因为向量会创建 Contained 的副本然后销毁它们,因此即使在我们正在使用的副本中也会破坏数据指针。
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;
}
推荐阅读
- typescript - 在某些目录中进行更改时防止重启 NestJS 服务器
- r - R - 在收集函数中使用列索引
- reactjs - 调度和设置状态后是否调用或更新渲染
- android - _TypeError(类型'列表
' 不是 'PlaceDetails' 类型的子类型) - c - 在 C 中声明并稍后定义一个数组
- delphi - 如何防止 TStrings.SaveToStream 写入 BOM?
- python - 列表元素的代数运算
- amazon-web-services - 无论如何要将火花分区写入不同的子路径?
- python - 面对 MASK RCNN 中的此错误“未定义名称‘COCO’”
- python - 计算 numpy.array 对象在 numpy.array 对象列表中的出现