在 C++ (11) 中释放局部变量是否有定义的顺序?更简洁地说:同一范围内的两个局部变量的析构函数的副作用将以什么顺序变得可见?
例如:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
当 main 返回或 C++11 中未定义顺序时,是先销毁x1
还是先销毁?x2
在 C++ (11) 中释放局部变量是否有定义的顺序?更简洁地说:同一范围内的两个局部变量的析构函数的副作用将以什么顺序变得可见?
例如:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
当 main 返回或 C++11 中未定义顺序时,是先销毁x1
还是先销毁?x2
在每一类存储类中(动态分配的对象除外),对象以相反的构造顺序被销毁。
这是一种Stack Data Structure
行为,因此局部变量作为数据结构存储在 Stack 中LIFO (Last-In-First-Out)
,您可以想象在 LIFO 数据结构中,最后添加到结构中的变量必须是第一个要删除的变量。变量是removed
从堆栈中reverse order
到它们相加的顺序。
它们以相反的分配顺序被销毁,请参阅这个 SO question。在这种情况下,这意味着x2
将在 之前被销毁x1
。
它们将按照相反的建造顺序被摧毁。
https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
isocpp.org 有一个关于这个主题的常见问题解答,它说它是以相反的顺序进行的。我认为当这个原始问题被问到时,官方网站并不存在。