全局变量如何在销毁时产生错误,而局部变量却不会
How can a global variable produce an error on desctruction while local variable does not?
我有一个类,我发现很难调试。奇怪的是,当我使用它作为局部变量时,它表现得很好,但是当我使用它作为全局变量时,它在程序退出时给出一个错误。
例如: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将其销毁。
相关文章:
- 修复未初始化的局部变量错误
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 我创建的类似乎错误地设置了它的局部变量
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- 静态局部变量会被错误地优化吗?
- 错误 C4700:使用未初始化的局部变量'result'
- 尝试声明函数的局部变量,但得到范围错误
- 指针被分配给错误的局部变量
- 错误 C4700:使用未初始化的局部变量'enemyHealth'
- 在c++上创建税务计算程序,错误为未初始化的局部变量
- C++错误 C4700:使用未初始化的局部变量'i'
- 我不断收到错误:运行此代码时重新定义'i'。对局部变量的误解
- 从函数中引用局部变量不会给出错误
- 错误 C4700:使用未初始化的局部变量'A'
- C++:使用错误 C4700 未初始化的局部变量""
- 错误 C4700:使用未初始化的局部变量'lowest'
- 错误 1 错误 C4700:未初始化的局部变量'rate'并在C++中'hours'
- 全局变量如何在销毁时产生错误,而局部变量却不会
- 未初始化的局部变量使用错误
- 如何在循环外打印总和?我认为全局变量和局部变量的减速存在一些错误