静态局部对象的构造函数何时被调用?

5

可能是重复问题:
C++函数中静态变量的生命周期是什么?

假设我们有以下代码:

Some class {
  Some() { // the ctor code }
};

Some& globalFunction()
{
  static Some gSome;
  return gSome;
}

“ctor代码”确切执行的时间是什么时候?对于普通静态变量来说,是在main()函数之前还是在第一次调用“globalFunction()”函数时?

在不同的平台和编译器(如cl、gcc等)上有何不同?

谢谢。

-hb-


1
复制 https://dev59.com/GnVC5IYBdhLWcg3wlyMo - anon
1个回答

5
Some构造函数将在第一次调用globalFunction()时运行。这在Scott Meyer的Effective C++,Item 4中有讨论。
这是由标准强制执行的。
请注意,析构函数可能仍然存在问题!一般来说,无法确定何时安全地删除此对象,另一个线程(可能存在于main之后)可能在本地静态已被销毁后调用此函数,因此通常通过使用“new”创建它们来“泄漏”这些对象。
但是,请注意,像这样创建静态对象本身就不是线程安全的。
全局静态对象将在main之前以未定义的顺序构建。

这个问题让我想起了一篇关于C++中单例和线程安全的优秀文章: http://www.drdobbs.com/184405726 和 http://www.drdobbs.com/184405772。 - fingerprint211b
@Honza:没问题,请留言附上链接,我想看看 :) [注意:像往常一样,这里有一些特殊情况——尤其是线程安全部分……所以在某些特殊条件下可能是可以的] - Stephen
@fingerprint:感谢您提供的链接,我稍后会阅读它们。 - Stephen
1
@Stephen:当这个对象被删除(自动)时,它已经有了一个明确定义的点。虽然它可能在技术上不是线程安全的,但gcc使其线程安全,并且我已经看到过讨论,MS编译器也将很快使其线程安全。说全局静态变量的顺序未定义并不够准确。对于某些情况(在同一编译单元中),它是有定义的。 - Martin York
@Martin:这就是为什么我评论说“在特殊情况下可能没问题”,但列举这些情况不是我想要进入的内容。而且你说得对,我应该更准确地说明结构顺序。 - Stephen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接