【问题标题】:When exactly is constructor of static local object called? [duplicate]什么时候调用静态本地对象的构造函数? [复制]
【发布时间】:2010-06-17 15:21:13
【问题描述】:

可能重复:
What is the lifetime of a static variable in a C++ function?

假设我们有这样的代码:

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

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

“ctor 代码”究竟是什么时候执行的?至于在main()之前还是我们第一次调用'globalFunction()'时的普通静态变量?

在不同平台和不同编译器(cl、gcc、...)上的表现如何?

谢谢

-hb-

【问题讨论】:

标签: c++ static constructor local


【解决方案1】:

Some 构造函数将在第一次调用 globalFunction() 时运行。这在 Scott Meyer 的 Effective C++, Item 4 中有讨论。

这是由标准强制执行的。

请注意,析构函数可能仍然存在问题!一般来说,不可能知道什么时候删除这个对象是安全的,另一个线程(可能生活在 main 之后)可能会在本地静态被破坏后调用这个函数,因此,这些对象经常通过创建“泄漏”他们用'新'。

但是,还要注意,创建这样的静态对象无论如何都不是线程安全的。

全局静态对象将在 main 之前构造,它是一个未定义的顺序。

【讨论】:

  • 谢谢斯蒂芬,我可以在 mozilla 错误评论中引用你吗?
  • 这个问题让我想起了一篇关于 C++ 中的单例和线程安全的优秀文章:drdobbs.com/184405726drdobbs.com/184405772
  • @Honza :当然,请用链接发表评论,我想阅读它:) [注意:(一如既往)有一些特殊情况 - 尤其是线程安全部分...所以在某些特殊情况下可能没问题]
  • @fingerprint :感谢这些链接,稍后我会阅读这些链接。
  • @Stephen:这个对象在被删除(自动)时已经有一个明确定义的点。此外,它在技术上可能不是线程安全的,但 gcc 使其成为线程安全的,我已经看到 MS 编译器也将很快使其成为线程安全的讨论。说全局静态的顺序未定义是不够准确的。它是为某些情况定义的(在同一个编译单元中)。
猜你喜欢
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多