是否存在一个定义的顺序,其中局部变量在C++(11)中被释放? 更简洁:在同一个作用域中,两个局部变量的析构函数的副作用将变为可见?C++局部变量销毁顺序
例如为:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
是x1
或x2
毁坏第一主时返回或顺序未定义在C++ 11?
是否存在一个定义的顺序,其中局部变量在C++(11)中被释放? 更简洁:在同一个作用域中,两个局部变量的析构函数的副作用将变为可见?C++局部变量销毁顺序
例如为:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
是x1
或x2
毁坏第一主时返回或顺序未定义在C++ 11?
在每个类别的存储类(动态分配的对象除外)中,对象按照与构造相反的顺序被销毁。
它们以反向分配顺序销毁,请参阅this SO question。在这种情况下,这意味着x2
将在x1
之前销毁。
这是一个Stack Data Structure
行为,所以局部变量存储在Stack中作为LIFO (Last-In-First-Out)
数据结构,可以想象在LIFO数据结构中,最后一个添加到结构中的变量必须是第一个被删除的变量。变量是从reverse order
中堆栈的removed
到它们添加的顺序。
堆栈是LIFO,而不是FIFO。 (队列是FIFO。) – Spire
C++标准的哪些部分保证了这个顺序? –
@DavidGrayson每个类别的不同部分。对于带有 线程本地或静态存储的对象,请参阅§3.6.3。对于具有自动 生命周期的对象,请参阅第6.6节(它不适用于人们可能期望寻找 的地方)。对于班级成员和基地,请参阅§12.4/ 8。临时参见 §12.2。 –
暂时不严格遵循LIFO排序,由于参考直接绑定一个时的延长寿命。 –