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

时间:2014-02-22 01:01:41

标签: c++ destructor iostream static-variables

鉴于我的代码的这个缩小版本:

#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时会出现SEGFAULTS。

我正在尝试确保在程序终止时总是打印一些文本。我正在尝试使用iostream合法吗?使用atexit(3)会不会更好?

我认为因为cout是在我使用它之前构建的,所以它会在之后被销毁;所以不清楚为什么像上面这样的代码不应该总是有效。

更新

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

1 个答案:

答案 0 :(得分:0)

如果在构造静态对象后调用pip install --no-binary MySQL-python MySQL-python ,则在调用该对象后将破坏静态对象。所以使用atexit()来解决问题是的。

请参阅Order between destruction of global object and atexit in C++