2

バグが原因でクラッシュしたC++プログラムがあります。静的グローバルオブジェクトのコンストラクター関数の1つでNULLポインターがアクセスされたため、メインに到達することさえありませんでした。さらに悪いことに、ポインタはNULLでしたが、別のグローバル静的変数によって設定されている必要がありました。これらのグローバルを、オブジェクトへのグローバルポインタを設定する関数でラップできると思います。グローバルを再設計する必要があることを私は知っています。また、グローバル静的オブジェクトの順序が不明であることも知っています。私は興味があります-静的グローバルオブジェクトの初期化の順序を制御するための良い受け入れられた方法はありますか?

簡略化された例(ロギングなどをチェックするエラーを削除)

[game.cpp]

Point UpperLeft(-1024.1024); //Global Evilness

int InitializeGobals()
{
   ...
}


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

     WriteHighScore(UpperLeft);
}

以下を使用して、すべての静的オブジェクトを順番に指定したいと思います。

[prposedgame.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);
}

[本当に関連性はありませんが、問題の理解に役立つ場合があります]

[Point.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
}

[Point.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

静的オブジェクトのインスタンス化を制御する1つの方法は、このFAQで説明されているように、最初の使用イディオムで構成を使用することです。

于 2009-04-25T18:14:30.220 に答える