静态析构函数的顺序

rth*_*hur 14 c++

如果一个类Foo有一个静态成员变量Bar,我希望Bar析构函数只能在析构函数的最后一个实例运行之后才能Foo运行.下面的代码片段不会发生这种情况(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>();
}
Run Code Online (Sandbox Code Playgroud)

输出:

Bar()
Foo()
~Bar()
~Foo()
Run Code Online (Sandbox Code Playgroud)

为什么破坏的顺序不是这里的建筑逆转?如果~Foo()使用Foo::bar这是删除后的用途.

nwp*_*nwp 11

在C++中,对象按出现的顺序构造,并以相反的顺序进行破坏.首先是foo施工,然后bar施工然后main执行然后bar被破坏然后foo.这是你看到的行为.出现开关是因为构造函数foo没有构造一个Foo,它构造一个空的unique_ptr,所以你不会Foo()在输出中看到.然后bar构造与输出和main创建实际的Foofoo早已构建.