使用g ++退出以后的程序后出现分段错误:
#include <iostream>
#include <fstream>
int
main()
{
std::ofstream logfile( "logfile" ) ;
if( !logfile.is_open() )
{
std::cerr << "oops ofstream\n" ;
return -1 ;
}
std::clog.flush() ;
std::clog.rdbuf( logfile.rdbuf() ) ;
std::clog << "test output\n" ;
std::clog.flush() ;
std::cerr << "all done\n" ;
return 0 ;
}
有什么线索?
答案 0 :(得分:3)
std::clog
和朋友的生命周期由std::ios_base::Init
类型的静态对象管理(C ++ 11 27.5.3.1.6 Class ios_base :: Init)。当该对象被销毁时(在main()
返回之后),它将执行以下操作:销毁std::clog
和相关的iostream
对象(C ++ 11 27.5.3.1.6 / 4类ios_base: :初始化):
调用cout.flush(),cerr.flush(),clog.flush(),wcout.flush(),wcerr.flush(),wclog.flush()
对flush()
的调用将使用rdbuf()
中的clog
对象,并且由于先前传递给logfile.rdbuf()
的{{1}}已被销毁,因此您将获得未定义的行为