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 ★★★★★ ()

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

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 ()

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

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

st0ke ()