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

C++ 重新分配std::clog时退出segv,c++,std,C++,Std,对于以下程序,我在使用g++退出后出现分段错误: #include <iostream> #include <fstream> int

对于以下程序,我在使用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 ;                                                              
    }                                                                       
#包括
#包括
int
main()
{                                                                       
std::of流日志文件(“日志文件”);
如果(!logfile.is_open())
{                                                                   

std::cerrstd::clog
和好友的生命周期由类型为
std::ios_base::Init
(C++11 27.5.3.1.6类ios_base::Init)的静态对象管理。当该对象被销毁时(在
main()之后返回),它执行以下操作:销毁
std::clog
和相关的
iostream
对象(C++11 27.5.3.1.6/4类ios_base::Init):

调用cout.flush()、cerr.flush()、clog.flush()、wcout.flush()、wcerr.flush()、wclog.flush()


flush()
的调用将使用
clog
中的
rdbuf()
对象,并且由于先前传递给
clog
logfile.rdbuf()
已被销毁,您将获得未定义的行为。

我猜这与
logfile
main()时被销毁有关
返回并
阻塞
之后被使用和/或销毁。是否尝试附加调试器并查看回溯?我尝试了,segv在退出时刷新。如果我更改程序,保存阻塞缓冲区并在退出前重新分配它,我不会得到segv,但我不明白为什么。
logfile
在主端销毁其缓冲区。由于
clog
现在共享其缓冲区,当它尝试刷新其内容作为其自身销毁的一部分时,它会访问已销毁的对象。看,你有解决方案了!在
main
的末尾,日志文件及其缓冲区被销毁。然后
clog
持有一个悬空指针。