鉴于我的代码的这个缩小版本:
#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
而不是通过引用,则可以正常工作。那更奇怪了。
答案 0 :(得分:0)
如果在构造静态对象后调用pip install --no-binary MySQL-python MySQL-python
,则在调用该对象后将破坏静态对象。所以使用atexit()
来解决问题是的。
请参阅Order between destruction of global object and atexit in C++