Как удалить указатель, принадлежащий объекту, хранящемуся в векторе? - PullRequest
2 голосов
/ 29 марта 2020

У меня есть класс Contained, класс Contained и класс Data. Этот Содержащий класс содержит вектор Содержащих объектов. Класс 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();
}

Где я могу удалить данные?

1 Ответ

1 голос
/ 29 марта 2020

Использование RAII (Resource Acquisition is Initialization)

Добавить деструктор к классу 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...