Использование 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;
}