C++ 重新分配std::clog时退出segv
对于以下程序,我在使用g++退出后出现分段错误:C++ 重新分配std::clog时退出segv,c++,std,C++,Std,对于以下程序,我在使用g++退出后出现分段错误: #include <iostream> #include <fstream> int
#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
持有一个悬空指针。