LINUX.ORG.RU

Поле типа unique_ptr и деструктор

 , ,


0

1

Добрый день!
Познаю c++

#include <iostream>
#include <memory>

class Foo {
    public:
        Foo(const bool needСhildren);
        ~Foo();
        bool isParent;
        std::unique_ptr<Foo> children;
};

Foo::Foo(const bool needChildren) {
    std::cout << "Construct new Foo" << std::endl;
    if (needChildren) {
        this->isParent = true;
        this->children = std::make_unique<Foo>(false);
    } else {
        this->isParent = false;
    }
    
}

Foo::~Foo(void) {
    std::cout << "Destruct";
    if (isParent) {
        std::cout << " parent ";
    } else {
        std::cout << " children ";
    }
    std::cout << " Foo" << std::endl;
}

void foo() {
    std::cout << "call foo()" << std::endl;
    std::make_unique<Foo>(true);
    std::cout << "end foo()" << std::endl;
}

int main() {
    foo();
    return 0;
}

В консоли

call foo()
Construct new Foo
Construct new Foo
Destruct parent  Foo
Destruct children  Foo
end foo()

Объясните, ткните в стандарт или хоть какое нибудь описание - как вызывается деструктор поля children если в деструкторе явно это не определено? Как поле unique_ptr понимает, что «пора» самоуничтожаться?

как вызывается деструктор поля children

При разрушении содержащего поле объекта, очевидно.

если в деструкторе явно это не определено

И не должно быть.

intelfx ★★★★★
()
Ответ на: комментарий от matroskin

Внезапно, да.

Ты ещё удивись, что деструкторы для объектов на стеке вызываются автоматически-неявно :)

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)

[class.dtor]:

After executing the body of the destructor and destroying any automatic objects
allocated within the body, a destructor for class X calls the destructors for
X's direct non-variant non-static data members, [...]
xaizek ★★★★★
()

ткните в стандарт или хоть какое нибудь описание - как вызывается деструктор

For both user-defined or implicitly-defined destructors, after the body of the destructor is executed, the compiler calls the destructors for all non-static non-variant members of the class, in reverse order of declaration

https://en.cppreference.com/w/cpp/language/destructor

Как поле unique_ptr понимает

Компилятор вызывает его деструктор после выполнения дестуктора класса. Такое поведение определено стандартом

Rot1
()

Почитай Страуструпа и будешь всё знать.

anonymous
()

Ждём следующий топик:

int a = 1, b = 2, c = a + b;

Объясните, ткните в стандарт или хоть какое нибудь описание ­— почему c == 3?

anonymous
()

Возьми какой-нибудь учебник. Это совсем базовые вещи.

anonymous
()

https://ru.m.wikipedia.org/wiki/Получение_ресурса_есть_инициализация

Одна из очень крутых штук, надо знать. Из нее вытекает и неявное конструирование полей в конструкторе и уничтожение в деструкторе. Причем первое происходит в порядке их (про поля речь) объявления, а второе в обратном.

st0ke
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.