【发布时间】:2011-01-13 08:38:29
【问题描述】:
从我的示例程序中,看起来它在这两种情况下都调用了析构函数。它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该分配在程序堆栈的数据部分?
【问题讨论】:
标签: c++ global-variables destructor
从我的示例程序中,看起来它在这两种情况下都调用了析构函数。它在什么时候调用全局变量和类静态变量的析构函数,因为它们应该分配在程序堆栈的数据部分?
【问题讨论】:
标签: c++ global-variables destructor
来自 C++03 标准的第 3.6.3 节:
静态存储持续时间(在块范围或命名空间范围声明)的已初始化对象的析构函数 (12.4) 作为从 main 返回的结果和调用 exit (18.3) 的结果而被调用。这些对象的销毁顺序与其构造函数完成或动态初始化完成的相反顺序。如果对象是静态初始化的,则对象的销毁顺序与动态初始化对象的顺序相同。对于数组或类类型的对象,该对象的所有子对象都会在构造子对象期间初始化的具有静态存储持续时间的任何本地对象被销毁之前被销毁。
此外,§ 9.4.2 7 规定:
静态数据成员的初始化和销毁与非本地对象(3.6.2、3.6.3)完全相同。
但是,如果析构函数没有可观察的行为,则它可能不会被调用。 Terry Mahaffey 在他的answer to "Is a C++ destructor guaranteed not to be called until the end of the block?" 中详细说明了这一点。
【讨论】:
“主要”之后的某个地方
(您无法知道或依赖它们被调用的确切顺序)
【讨论】:
std::cout 被破坏。 IE。你可以在那里打印东西。
cout 或调用其构造函数的第一个调用的顺序(例如operator<<()) .我怀疑它是有保证的,在这种情况下,我会在这个答案中再次强调“不能依赖”。