0

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

例如:

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

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

尽管

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

效果很好。

我希望,通过知道在什么情况下会发生这种情况,我可以深入了解课堂上的问题。我在很多情况下都尝试了这个类,但症状总是一样的,全局变量总是有问题,而局部变量总是很好。

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

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

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

4

1 回答 1

0

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

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

于 2013-05-10T23:18:36.880 回答