有一个函数可以打印一些东西,当需要销毁对象(必须是全局对象)时,我需要在main和析构函数中显式调用此函数。但是,析构函数的调用不会显示在文件中。
#include <iostream>
#include <fstream>
using namespace std;
class A {
public:
friend void func(A&);
~A() {
func(*this);
}
};
A a;
ofstream out;
int main() {
out.open("file.txt");
func(a);
cin.get();
return 0;
}
void func(A& a) {
out << "\nHello!!!\n";
}
我只看到一个&#34;你好!!!&#34;在文件中我想要两个。我也没有关闭ostream对象。理想情况下,我想在析构函数中调用函数后关闭它。我该怎么办?
答案 0 :(得分:1)
同一翻译单元中的静态对象按其定义顺序构建,并按相反顺序进行破坏,如here所述
因此,你的&#34; out&#34;在调用析构函数并尝试写入之前,对象被破坏(因此关闭)。
切换声明顺序可以解决问题,但可能不是一个很好的解决方案,你最好完全避开静态的全局对象。 (特别是尽量避免依赖于破坏的顺序)。