首页 > 解决方案 > 如何删除属于存储在向量中的对象的指针?

问题描述

我有一个包含类、一个包含类和一个数据类。该 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();
}

我在哪里删除数据?

标签: c++c++11memory

解决方案


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

推荐阅读