Something.hpp
#pragma once
class Something {
public:
static Something& get();
private:
Something();
};
Something.cpp
#include "Something.hpp"
#include <iostream>
using namespace std;
Something& Something::get() {
static Something something;
return something;
}
Something::Something() {
cout << "Something()" << endl;
}
main.cpp
#include <iostream>
using namespace std;
struct SomethingElse {
~SomethingElse() {
Something::get();
cout << "~SomethingElse" << endl;
}
};
void func() {
static SomethingElse something_else;
// do something with something_else
}
int main() {
func();
return 0;
}
是否可以创建多个Something
对象的实例?标准是否有关于静态对象销毁序列化的规定?
注意:我知道文件级静态变量在不同翻译单元之间销毁是未定义的,我想知道函数作用域静态变量的情况(其中包含C++运行时中的双重检查锁定模式)。对于同一翻译单元的文件级静态变量,编译器可以通过代码中变量的布局(静态)来确保构造和销毁的序列化,但当变量在调用函数时动态地懒惰创建时会发生什么呢?
注意:原始变量呢?我们可以期望它们保留值直到程序结束吗?因为它们不需要被销毁。
编辑
在cppreference.com上找到了这个(http://en.cppreference.com/w/cpp/utility/program/exit)
如果线程本地或静态对象A的构造函数或动态初始化在线程本地或静态对象B之前被序列化,则B的销毁完成在A的销毁开始之前被序列化
如果这是真的,那么每个静态对象的销毁都是串行的吗?但我也发现了这个
https://isocpp.org/wiki/faq/ctors#construct-on-first-use-v2,与标准相矛盾