静态/全局对象的创建顺序

Creation order of static/global objects

本文关键字:创建 顺序 对象 全局 静态      更新时间:2023-10-16

在我的应用程序中,有两个全局对象。一个对象的构造函数——它访问另一个对象——假设它已经创建。幸运的是,我的应用程序在一段时间内运行正常。但是,由于cpp文件和编译顺序最近发生了变化,我发现全局对象的创建顺序与我的应用程序预期的不同。

所以,我的问题是,

是否有一种方法可以控制全局对象的创建顺序。我认为静态对象也应该有同样的问题。根据我的试用,我发现链接顺序或"o"文件会改变这一点。但这是正确的吗?难道没有合适的方法吗?

忽略全局变量不是一个好主意的事实,您可以将对象封装在函数中。通过这种方式,它们在第一次访问时被创建,让您可以控制创建顺序:

Foo& get_foo()
{
  static Foo f;
  return f;
};
Bar& get_bar()
{
  static Bar b(get_foo());
  return b;
}

使用示例:

int main() {
    Bar& b = get_bar();
    return 0;
}

一种很好的可维护方法是创建指向这些对象的全局指针,并按所需顺序在单个函数(如main((或其他地方(中分配它们。如果您改为进行"惰性评估",并简单地让对象在访问时创建,那么它们的顺序就不那么明显了,因此维护性也就降低了。

这当然意味着,如果指针没有初始化,那么它们将为空指针。

如果A的ctor必须使用对象B,那么A应该断言B不是null。

(编辑:这并不是说懒惰评估没有它的位置,但对于这种情况,我个人会使用指针(

查看Singleton模式(从yolinux复制(。有一些变体,但其想法是在通过Instance()访问类的第一次使用时指定创建,然后用于访问代码中其他任何地方的类的唯一实例。

class Singleton{
public:
  static Logger* Instance(){
    if(!m_pInstance) return new Singleton;
    return m_pInstance;
  }
private:
  Singleton(){};  // Private so that it can  not be called
  Singleton(Singleton const&){};             // copy constructor is private
  Singleton& operator=(Singleton const&){};  // assignment operator is private
  static Singleton* m_pInstance;
};

这部分应该在标题之外(最好在正文文件中(:

Singleton::Singleton* m_pInstance = NULL;