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;
}
察するに, ofsLog
を main()
内部の自動変数とした場合は, std::clog
なる (静的) オブジェクトが消滅するよりも先に ofsLog
が消滅するため, std::clog
のストリームバッファ オブジェクトに対する処理が破綻してセグフォ発生, ということなんだろう. そうだとすれば ofsLog
は std::clog
よりも長生きする必要があるんだろう, ということで上のようにした次第. (参考 URL)
ここで気になるのは, ofsLog
を静的変数とした場合に, これと std::clog
とではどちらが先に消滅するのか, またその順番は常に一定と保証されているのか否か, ということ.