重新分配std :: clog时退出segv

时间:2016-02-24 19:17:37

标签: c++ std

使用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 ;                                                              
    }                                                                       

有什么线索?

1 个答案:

答案 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}}已被销毁,因此您将获得未定义的行为