【问题标题】:C++ local variable destruction orderC++局部变量销毁顺序
【发布时间】:2013-01-19 05:51:01
【问题描述】:

在 C++ (11) 中释放局部变量的顺序是否已定义? 简而言之:同一作用域内的两个局部变量的析构函数的副作用会按什么顺序显示?

例如:

struct X{
  ~X(){/*do something*/}
}

int main(){
   X x1;
   X x2;
   return 0;
}

x1x2 在 main 返回时首先销毁还是在 C++11 中未定义顺序?

【问题讨论】:

    标签: c++ c++11 destructor local-variables


    【解决方案1】:

    它们将按照相反的构造顺序被销毁。

    【讨论】:

    • 其实,它们的构造顺序正好相反。
    【解决方案2】:

    在每一类存储类中(动态分配的对象除外),对象的销毁顺序与构造的相反。

    【讨论】:

    • C++ 标准的哪一部分保证了这个顺序?
    • @DavidGrayson 每个类别都有不同的部分。对于具有线程本地或静态存储的对象,请参阅 §3.6.3。对于具有自动生命周期的对象,请参阅第 6.6 节(这是不是人们可能期望寻找它的地方)。对于类成员和基础,请参阅 §12.4/8。对于临时人员,请参阅 §12.2。
    • 临时文件不严格遵循 LIFO 排序,因为引用直接绑定时会延长生命周期。
    • @BenVoigt 低估了评论。
    【解决方案3】:

    它们以相反的分配顺序被销毁,参见this SO question。在这种情况下,这意味着x2 将在x1 之前被销毁。

    【讨论】:

      【解决方案4】:

      这是Stack Data Structure 的行为,所以局部变量在Stack 中存储为LIFO (Last-In-First-Out) 数据结构,您可以想象在后进先出数据结构中,最后添加到结构中的变量必须是第一个要删除的变量。变量是removed从堆栈中的reverse order到它们相加的顺序。

      【讨论】:

      • 堆栈是 LIFO,而不是 FIFO。 (队列是先进先出的。)
      【解决方案5】:

      我。关于局部变量

      1. 局部变量分配在堆栈上。

      2. 堆栈基于LIFO (Last-In-First-Out) 模式。

      3. 所以变量被销毁和释放的顺序与分配和构造相反。

      二。关于你的例子

      你的函数main()被调用:

      • x1是在Stack上分配和构造的,
      • x2堆栈上分配和构造

      当到达main()函数范围的末尾时:

      • x2 被销毁并从堆栈中释放
      • x1 被销毁并从 堆栈 中释放

      三。而且

      堆栈如下所示:

      堆栈的行为似乎更易于理解)

      【讨论】:

      • 虽然我不同意这张图片,但实现不再是推送/弹出,而且多年来一直如此。相反,它执行一个sub %esp, <size>,并在退出时执行add %esp, <size>。所以换句话说,所有必要的空间都被一次性分配(只有alloca()会进一步动态地减少堆栈指针。)
      • 此问题与堆栈的存在或在其上分配事物的方向无关。这与 词法作用域 以它们建立的相反顺序被放弃有关。对象x1x2 可以按任意顺序分配到堆栈帧中。甚至根本没有;例如它们可以是空结构。
      • @AlexisWilke 幽灵!在几秒钟内对 2014 年的回答发表类似评论。
      【解决方案6】:

      https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals

      isocpp.org 有一个关于这个主题的常见问题解答,它说它以相反的顺序。我认为当这个原始问题被问到时,官方网站并不存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 2013-04-07
        相关资源
        最近更新 更多