ログ出力 (2)

1 年以上前に書いたこの記事の通りに実装したところ, どうやら main() 終了直前に必ずセグフォが発生する模様 (g++ (GCC) 4.1.1 (Gentoo 4.1.1-r1)). 以下のように書き直すと発生しないことが分かった.


#include <iostream>
#include <fstream>
#include <cstdlib>

// std::ofstream  ofsLog;           // 大域変数として宣言するか ...
// static std::ofstream  ofsLog;    // ここで静的変数として宣言するか ...

int main(void)
{
    static std::ofstream  ofsLog;   // ここで静的変数として宣言するか.

    ofsLog.open("verbose.log");
    if (ofsLog.fail())
    {
        std::cerr << "ERROR: can't open the log file.\n";
        return EXIT_FAILURE;
    }
    std::clog.rdbuf(ofsLog.rdbuf());

    std::clog << "This line is outputted to std::clog." << std::endl;

    ofsLog.close();     // わざわざ書く必要はないか

    return EXIT_SUCCESS;
}

察するに, ofsLogmain() 内部の自動変数とした場合は, std::clog なる (静的) オブジェクトが消滅するよりも先に ofsLog が消滅するため, std::clog のストリームバッファ オブジェクトに対する処理が破綻してセグフォ発生, ということなんだろう. そうだとすれば ofsLogstd::clog よりも長生きする必要があるんだろう, ということで上のようにした次第. (参考 URL)

ここで気になるのは, ofsLog を静的変数とした場合に, これと std::clog とではどちらが先に消滅するのか, またその順番は常に一定と保証されているのか否か, ということ.