在 C + + (11)中,局部变量释放的顺序是否定义好了? 更简洁地说: 在同一范围内两个局部变量的析构函数的副作用将以何种顺序变得可见?
例如:
struct X{ ~X(){/*do something*/} } int main(){ X x1; X x2; return 0; }
在 main 返回时,是先销毁 x1还是先销毁 x2,还是在 C + + 11中没有定义顺序?
x1
x2
它们将按照相反的建造顺序被摧毁。
在每个类别的存储类中(动态分配的对象除外) ,对象按照相反的构造顺序被破坏。
它们是按照反向分配顺序销毁的,请参阅 这个所以问题。在这种情况下,这意味着 x2将在 x1之前被销毁。
这是一个 Stack Data Structure行为,因此本地变量以 LIFO (Last-In-First-Out)数据结构的形式存储在 Stack 中,可以想象在 LIFO 数据结构中,最后添加到结构中的变量必须是第一个被删除的变量。变量是从 reverse order中的堆栈到它们的加法顺序的 removed。
Stack Data Structure
LIFO (Last-In-First-Out)
reverse order
removed
关于局部变量
局部变量在 Stack上分配。
Stack基于 LIFO(Last-In-First-Out)模式。
LIFO
Last-In-First-Out
因此,变量被销毁和释放的顺序与分配和构造的顺序相反。
关于你的例子
函数 main()被调用:
main()
当到达 main()函数范围的末端时:
此外
Stack是这样的:
(通过一个方案,Stack的行为似乎更容易理解)
Https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
Isocpp.org 有一个关于这个主题的常见问题解答,它说它做 以相反的顺序。我认为,官方网站不存在时,这个原来的问题已经提出,虽然。