在另一个翻译单元的静态破坏阶段引用时,"魔术静态"单例崩溃

0xb*_*7ed 7 c++ singleton multithreading visual-c++ c++11

我有一个琐碎的单身课程.我的singleton.h文件看起来像这样:

class singleton
{
...
public:
    static singleton& instance();
};
Run Code Online (Sandbox Code Playgroud)

singleton.cpp看起来像这样:

...
singleton& singleton::instance()
{
    static singleton * const _instance(new singleton);
    return *_instance;
}
Run Code Online (Sandbox Code Playgroud)

在编写这个类时,我认为我依赖于线程安全的函数本地静态初始化,我理解这将在这里描述的C++标准的第6.7节中阐述.希望我明白这是如何工作的.

我正在使用2013年11月的CTP工具链运行Visual C++ .微软称2013年11月CTP支持线程安全的函数本地静态初始化,并快速浏览编译器生成的目标代码,表明它正在尝试这样做.

我的问题是,在另一个翻译单元中销毁静态存储持续时间对象需要访问singleton::instance().我预计这不会有任何困难,因为静态变量支持singleton::instance()是一个永不删除的指针.但是,singleton::instance()来自该其他对象的调用正在崩溃我的进程,堆栈跟踪如下所示:

_Init_thread_header
singleton::instance
other_translation_unit_object::~other_translation_unit_object
Run Code Online (Sandbox Code Playgroud)

其中_Init_thread_header()似乎是由编译器插入来实现线程安全的静态初始化.

所以我的问题是:上面的代码是否表明我从根本上误解了静态初始化应该如何工作(最可能的情况是,如果是这样,那就好了:),或者是否有可能出现其他问题?

Col*_*sen 3

您使用的 Visual Studio 版本中未实现“神奇静态”。它们首先在 Visual Studio 2015 中实现。

https://msdn.microsoft.com/en-us/library/hh567368.aspx