"Magic static" 在另一个翻译单元的静态销毁阶段引用时单例崩溃



我有一个简单的单例类。我的singleton.h文件看起来像这样:

class singleton
{
...
public:
    static singleton& instance();
};

我的singleton.cpp是这样的:

...
singleton& singleton::instance()
{
    static singleton * const _instance(new singleton);
    return *_instance;
}

在编写这个类时,我认为我依赖于线程安全的函数局部静态初始化,我理解它在c++标准的第6.7节中有规定,如下所述。希望我明白这应该是如何工作的。

我正在运行Visual c++与2013年11月CTP工具链。微软表示,2013年11月CTP支持线程安全的局部函数静态初始化,并且快速浏览编译器生成的目标代码就会发现它正在尝试这样做。

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

_Init_thread_header
singleton::instance
other_translation_unit_object::~other_translation_unit_object

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

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

在您使用的Visual Studio版本中没有实现"Magic stats "。在Visual Studio 2015中首次实现。

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

最新更新