全局变量如何在销毁时产生错误,而局部变量却不会

How can a global variable produce an error on desctruction while local variable does not?

本文关键字:错误 局部变量 全局变量      更新时间:2023-10-16

我有一个类,我发现很难调试。奇怪的是,当我使用它作为局部变量时,它表现得很好,但是当我使用它作为全局变量时,它在程序退出时给出一个错误。

例如:

A a;
int main(){
  dosomething(a);
}

在程序退出时给出bad_alloc异常。

,

int main(){
  A a;
  dosomething(a);
}

行之有效。

我希望,通过了解在什么情况下会发生这种情况,我可以找到问题的根源。我在许多上下文中尝试过这个类,症状总是一样的,全局变量总是有问题,而局部变量总是工作得很好。

注1:该类有一个调用flush(非虚)成员函数的析构函数,该函数将内部缓冲区写入磁盘,并执行shell命令来处理该文件。

~A(){this->flush();}

注2:当我继续调试(并简化代码)时,我会尝试发布MWE。目前,它将有助于了解可能发生这种情况的典型情况,以帮助调试。

c++没有定义全局对象的构造顺序和销毁顺序。这样做的结果是,如果有两个(或更多)以某种方式相互依赖的全局对象(在您的例子中是A依赖于缓冲区和shell执行),那么当执行进入使用该依赖对象的析构函数时,依赖对象可能已经被销毁了。

您需要"手动"保证正确的销毁顺序。最简单的方法是在堆栈上分配对象(如您的工作示例所示)或在堆上分配对象,并在从main返回(或调用exit等)之前使用delete将其销毁。