C ++全局变量寿命

时间:2011-04-11 10:23:38

标签: c++ global

我有一个全局变量,它是一个类的实例。该类在其构造函数(directX)中创建了一个图像。

问题是我在运行时遇到访问冲突,但代码编译。我认为问题是在winmain函数初始化之前调用了类构造函数。

所以我想知道的是

  1. 有人遇到过这个问题并知道解决方案。

  2. 全局的生命周期是什么,我知道函数中声明的变量在返回后会丢失,并且编译器会查看代码,看看是否所有内容都匹配,这就是为什么我们必须使用原型函数但是在哪里做全球化进入了等式。

4 个答案:

答案 0 :(得分:4)

如果你真的想拥有一个全局实例,你可能想要查看singleton pattern这样的东西,可以在初始化完成后进行初始化(实质上,图像将在你第一次构建时构建)引用它之后你将使用预先构建的版本。)

在调用winmain之前构造Globals(以未定义的顺序)。他们呆在那里直到你的程序退出(此时我相信析构函数是以未定义的顺序调用的)..

您可以使用的另一种(可能更简单的)替代方法是将全局从类的实例更改为指向它的指针...然后您将拥有类似的内容:

// global...
MyGlobalClass *bigGlobalImageHolder;

// Winmain
// Perform directX setup (don't know what that is)
// Create the image class
bigGlobalImageHolder = new MyGlobalClass();


// do the rest of your stuff...  I'm guessing enter some kind of event loop

// clean up your global
delete bigGlobalImageHolder;
// exit your winmain (and application)

然后,无论您目前在哪里引用全局,都可以通过指针来引用它。

 // so
 bigGlobalImageHolder.GetImage();
 // becomes
 bigGlobalImageHolder->GetImage();

答案 1 :(得分:0)

您似乎遇到了“静态初始化顺序惨败”。

检查此this和以下常见问题。

如上所述,您可能希望实现一种或另一种Singleton

答案 2 :(得分:0)

  1. 我遇到过这个问题;无论class constructor中使用的代码是什么,都应该在class constructor开始之前进行初始化。假设其他变量也是全局变量,则应首先调用它们的构造函数。虽然global变量的构造函数是以未定义的方式调用的,但只有小的工作可以使用,在相同的文件中按照从最少依赖到最依赖的顺序定义依赖的全局变量。
  2. 全球寿命等于您的计划生命周期

答案 3 :(得分:0)

全局静态数据的生命周期是应用程序的生命周期。但是,在正常终止时,析构函数运行。

这个问题是初始化/破坏发生的顺序并不总是确定的,当然也不是可移植的(即取决于平台和运行时链接器)。

共享对象(动态链接)的情况最糟糕。某些平台允许使用链接器标志来指定共享对象的“优先级”(以便可以影响静态初始化顺序);其他平台(例如AIX gcc,HP / UX)需要特殊的编译器属性才能将静态过程标记为“dll初始化例程”。


简而言之:除了通过访问器功能外,不依赖于静态数据。访问器功能可能如下所示:

 static int _myinternalvar = 3;
 static int GetMyInternalVar()
 {
      return _myinternalvar;
 }

这样,你确定在执行函数之前已经初始化了静态。访问器是唯一可以访问数据的函数,您可以在其范围内声明静态(添加封装)。