在静态对象的析构函数中使用cout
Using cout in destructors of static objects
给定我的代码的精简版本:
#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之间的顺序
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 在静态对象的析构函数中使用cout