我有一个琐碎的单身人士班。我的singleton.h
文件看起来像这样:
class singleton
{
...
public:
static singleton& instance();
};
我的singleton.cpp
看起来像这样:
...
singleton& singleton::instance()
{
static singleton * const _instance(new singleton);
return *_instance;
}
在编写这个类时,我认为我依赖于线程安全的函数本地静态初始化,我理解这将在C ++标准的第6.7节中阐述,如here所述。希望我明白这是如何工作的。
我正在使用November 2013 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
编译器似乎插入_Init_thread_header()
以实现线程安全的静态初始化。
所以我的问题是:上面的代码是否显示我从根本上误解了静态初始化应该如何工作(最可能的情况是,如果是这样,那就好了:),或者是否可能出现其他问题?
答案 0 :(得分:2)
“Magic statics”未在您使用的Visual Studio版本中实现。它们最初是在Visual Studio 2015中实现的。