C++ 局部作用域对象的销毁顺序是什么?

C++ 局部作用域对象的销毁顺序是什么?,c++,scope,destructor,C++,Scope,Destructor,foo会在bar之前、bar之后被销毁吗,还是没有任何保证 myFunction() { Foo foo = Foo(); Bar bar = Bar(); return; } 它们按与其申报相反的顺序销毁。在 { Foo foo = Foo(); Bar bar = Bar(); } foo首先构造,然后是bar。当超出范围时-bar首先被破坏,然后foo在继承中则是相反的顺序。在你的情况下,它是在相同的创造顺序 Foo f= new Foo(); Bar

foo
会在
bar
之前、
bar
之后被销毁吗,还是没有任何保证

myFunction()
{
    Foo foo = Foo();
    Bar bar = Bar();
    return;
}

它们按与其申报相反的顺序销毁。在

{
 Foo foo = Foo();
 Bar bar = Bar();
}

foo
首先构造,然后是
bar
。当超出范围时-
bar
首先被破坏,然后
foo

在继承中则是相反的顺序。在你的情况下,它是在相同的创造顺序

 Foo f= new Foo();
 Bar b= new Bar();

函数的内存称为“堆栈”。就像其他的堆叠一样,你穿上的最后一件东西,就是你要脱下的第一件东西

因此,有效地,当函数返回且本地内存超出范围时,所有本地变量都会以相反的顺序被销毁


情况总是这样,您可以完全信赖(在同一线程中)。

在您的示例中没有创建任何对象。相反,声明了两个函数,分别命名为
foo
bar
。见@IgorTandetnik Darn you和your correction.)我已经更新了这个问题来反映意图。销毁顺序:就记录而言,C++没有函数范围的对象。您所称的函数作用域只是局部作用域的一个特例。@JamesKanze感谢您提供的信息。我已经更新了这个问题,使之更加准确。这甚至无法编译。C++!这是非常误导的,因为临时对象也被放置在堆栈上,它们将在任何非临时对象之前被销毁(在完整表达式的末尾。不,它们将遵循相同的顺序。临时变量通常是在以后才出现的,这就是为什么它们会在更早的时候被销毁。@user2032040 James在更深的意义上是正确的,我认为。编译器将按照它认为合适的方式将局部变量放在堆栈上,它不受限制地遵循您声明它们的顺序构造函数和析构函数将按正确的顺序调用,但堆栈上的位置取决于编译器决定执行的操作。@user2032040:是和否。当您编写
S=std::string(“Hello”);
时,编译器需要创建一个临时文件来保存
std::string
。它将代码转换为:
std::string\uu tmp(“Hello”);S=uu tmp;DESTROY(u tmp)
。请注意,
u tmp
的DESTROY是如何在
S
之前调用的,即使它也是以前构建的?@MatthieuM。是的。当临时变量参与局部变量的初始化时,几乎总是这样。