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
の有無にかかわらず、問題は同じです。私は実際には、上記のコードをスタンドアロンプログラムとして動作させるよりも、私の実際のプロジェクト(環境など)で間違っているのではないかということについてのアイデアを実際に探しています()。
実際には、プログラムはそのグローバルオブジェクトを含むソースファイル内の関数を呼び出す必要があります。そうしないと、リンカはそのオブジェクトファイルをリンクしません。 – Danh
また、gccを使って '-Wl、 - whole-archive'オプションを渡す必要があります。 http://stackoverflow.com/questions/14116420/how-to-force-gcc-to-link-an-unused-static-library – Danh
問題を再現するのに十分なコードが必要です。例えば、 'someFile'とは何ですか? –