2

我有一个由于错误而崩溃的 C++ 程序。它甚至不会进入 main,因为在其静态全局对象的构造函数之一中访问了 NULL 指针。更糟糕的是,指针是 NULL,但应该由另一个全局静态变量设置。我想我可以将这些全局变量包装在一个设置指向对象的全局指针的函数中。我知道需要重新设计全局变量。我也知道全局静态对象的顺序是未知的。我仍然很好奇——是否有一种公认的方法来控制静态全局对象初始化的顺序?

简化示例(删除了错误检查日志等)

[游戏.cpp]

Point UpperLeft(-1024.1024); //Global Evilness

int InitializeGobals()
{
   ...
}


int main (int argc, char ** argv)
{
     if (!InitializeGame())
        Die("Initialization Failure");

     WriteHighScore(UpperLeft);
}

我想使用以下命令指定所有静态对象:

[建议游戏.cpp]

Point *UpperLeft;
int InitializeGobals()
{
   Point IGUpperLeft = new Point(-1024.1024); 
   UpperLeft = &IGUpperLeft; 

   ...
}

int main (int argc, char ** argv)
{
     if (!InitializeGame())
        Die("Initialization Failure");
     WriteHighScore(UpperLeft);
}

[不是很相关,但可能有助于理解问题]

[点.cpp]

Point::Point() {  
    x = 0;
    y = 0;
}

Point::Point(int nx, int ny) {  
    x = nx;
    y = ny;
    strcpy(text,0);  //0 should have been set by another global static object
}

[点.h]

#ifndef POINT_H
#define POINT_H
class Point {
    public:
        Point();  
        Point(int nx, int ny); 
        int getX();
        int getY();
        int getText(*pcbuff);
    private:
        int x;
        int y;
        char text[2];
};
#endif
4

1 回答 1

3

控制静态对象实例化的一种方法是在第一次使用时使用构造,如本常见问题解答中所述

于 2009-04-25T18:14:30.220 回答