在静态对象的析构函数中使用cout

Using cout in destructors of static objects

本文关键字:cout 析构函数 静态 对象      更新时间:2023-10-16

给定我的代码的精简版本:

#include <iostream>
using namespace std;
struct S {
S( ostream &os ) : os_( os ) { }
~S() { os_ << "The end.n"; }         // line 7
ostream &os_;
};
void f() {
static S s( cout );
(void)s;
}
int main() {
f();
return 0;
}

该程序打印The end.。但是,作为较大程序的一部分,它在尝试写入ostream时SEGFAULS。

我正在努力确保某些文本将始终在程序终止时打印出来。我试图使用iostreams做的事情合法吗?使用atexit(3)会更好吗?

我想,因为cout是在我使用它之前建造的,所以它会在使用之后被摧毁;所以不清楚为什么像上面这样的代码不应该总是工作。

更新

如果我将第7行更改为直接写入cout,而不是通过引用写入,则工作正常。这更奇怪。

如果在构造静态对象后调用atexit(),则在调用该对象后将销毁该静态对象。因此,是的,使用atexit()应该可以解决问题。

参见C++中全局对象的销毁和atexit之间的顺序