2017-01-20 15 views
-1
typedef struct Object { 
    // some variable declarations. 
    Object(): var_(var) {} 
    ~Object(); 
private: 
    // Prevent the compiler from generating a default 
    // copy constructor and assignment operator 
    DISABLE_COPY_AND_ASSIGN(Object); 
} Object; 

Object::~Object() { 
    assert(!"Destructor called");. 
    if (1) { 
     logDebug(MODULE_STR_ID, "hello"); 
     assert(isUnitTest); 
     unlink(someFile); 
    } 
} 

static Object obj; 

// main() is in some other file. 

デストラクタのassertがヒットすることは予想されますが、そうではありません。受け入れられた答えDoes C++ call destructors for global and class static variables?では、デストラクタ呼び出しがなくても観測可能な振る舞いが同じであれば、コンパイラはデストラクタを最適化できると言います。しかし私はそれが私の例でどのように起こっているのかわかりません。私は、デストラクタがGDBで命令を出力することによってコンパイルされていないことを確認しました。デストラクタにブレークポイントを設定すると、GDBはプログラムの終了時に内部エラーに遭遇します!静的グローバル構造のデストラクタが呼び出されていない

PS:私が上記のコードを(もちろんコンパイル可能にして)オンラインIDEで実行すると、うまく動作します。私の環境に何か問題がありますか?

EDIT:上記のサンプルは、スタンドアロンプ​​ログラムとしてコンパイルされていても問題ありません。私の大きなプロジェクトの中にはありません。だから私は本当に私のプロジェクトでのみ起こるので、問題を再現するためのコードをもっと提供することはできません。 unlinkの有無にかかわらず、問題は同じです。私は実際には、上記のコードをスタンドアロンプ​​ログラムとして動作させるよりも、私の実際のプロジェクト(環境など)で間違っているのではないかということについてのアイデアを実際に探しています()。

+0

実際には、プログラムはそのグローバルオブジェクトを含むソースファイル内の関数を呼び出す必要があります。そうしないと、リンカはそのオブジェクトファイルをリンクしません。 – Danh

+0

また、gccを使って '-Wl、 - whole-archive'オプションを渡す必要があります。 http://stackoverflow.com/questions/14116420/how-to-force-gcc-to-link-an-unused-static-library – Danh

+0

問題を再現するのに十分なコードが必要です。例えば、 'someFile'とは何ですか? –

答えて

1

私は_exit()を呼び出してmainを終了するGoogleテストの一部として上記のプログラムを実行していました。また、プログラムが_exit()を呼び出して終了したときに、静的グローバルオブジェクトのデストラクタが呼び出されないようです。 this answerthis

0

デストラクタは、常にあなたのコードで呼び出されます。そして、google testは、失敗しています。

デストラクタにブレークポイントを設定した場合、GDBはプログラムの最後の に内部エラーが発生します!

は、主な機能は終了したと、おそらくいくつかの関連するライブラリはこの時点で未初期化されているので、リンク解除コールは、いくつかの予期しない動作を引き起こす可能性があり、グローバルオブジェクトのデストラクタではunlink(somefileという)を呼び出すしないようにしてください。 GDBが内部エラーに遭うのはなぜでしょうか。

なぜあなたのデストラクタがコンパイルされていないとおっしゃいましたか? objdumpとaddr2lineでコードを逆アセンブルして確認してください。

+0

'unlink'かどうかは、動作は同じようです。私は 'x/i StasisHaState ::〜StasisHaState()'を実行し、関数の内容はそこにあります –

+0

あなたのプロジェクトの他のコードに問題があるはずです。あなたのプロジェクトが大きければ、時間コストがありますが、それをチェックする簡単な方法です。プロジェクトからすべてのコードを削除し、サンプルコードの上に残しておき、ファイルごとにコードを追加し、最後に問題の原因となっている部分を見つけることができます。 –

関連する問題