У меня проблемы с полным пониманием оператора присваивания для unique_ptr. Я понимаю, что мы можем перемещать их только из-за того, что конструктор копирования и операторы присваивания удалены, но что если
unique_ptr, который уже содержит выделение, перезаписывается операцией перемещения? Содержимое, ранее сохраненное в смарт-указателе, свободно?
#include <iostream>
#include <memory>
class A{
public:
A() = default;
virtual void act() const {
std::cout << "act from A" << std::endl;
}
virtual ~A() {
std::cout << "destroyed A" << std::endl;
}
};
class B : public A {
public:
B() : A{} {}
void act() const override {
std::cout << "act from B" << std::endl;
}
~B() override {
std::cout << "destroyed from B " << std::endl;
}
};
int main() {
auto pP{std::make_unique<A>()};
pP->act();
==================== ! =======================
pP = std::make_unique<B>(); // || std::move(std::make_unique<B>())
==================== ! =======================
pP->act();
return 0;
}
Когда я делаю
pP = std::make_unique<B>();
означает ли это, что то, что было выделено в первых строках для pP (new A ()), уничтожается автоматически?
Или я должен выбрать:
pP.reset();
pP = std::make_unique<B>();