如果一个类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创建实际的Foo后foo早已构建.