Если класс Foo
имеет статическую переменную-член Bar
, я ожидал бы, что деструктор Bar
будет запущен только после запуска последнего экземпляра Foo
destructor. Это не происходит с фрагментом кода ниже (gcc 6.3, clang 3.8):
#include <memory>
#include <iostream>
class Foo;
static std::unique_ptr<Foo> foo;
struct Bar {
Bar() {
std::cout << "Bar()" << std::endl;
}
~Bar() {
std::cout << "~Bar()" << std::endl;
}
};
struct Foo {
Foo() {
std::cout << "Foo()" << std::endl;
}
~Foo() {
std::cout << "~Foo()" << std::endl;
}
static Bar bar;
};
Bar Foo::bar;
int main(int argc, char **argv) {
foo = std::make_unique<Foo>();
}
Выходы:
Bar()
Foo()
~Bar()
~Foo()
Почему порядок разрушения здесь не наоборот?
Если ~Foo()
использует Foo::bar
, это будет полезно после удаления.