代码之家  ›  专栏  ›  技术社区  ›  cpp_enthusiast

对优化级别为0的std::vector调用析构函数两次

  •  -3
  • cpp_enthusiast  · 技术社区  · 8 年前

    我试图理解为 std::vector emplace_back (or) push_back compiler explorer .

    注:优化级别为0,即使用-O0

    我不明白的一点是,为什么要调用两个析构函数而不是一个(因为你可以看到只创建了一个向量)。如果我假设一个临时对象是在内部创建的,那么至少我必须看到对 标准::向量 建造师。

    这与clang编译器也是一样的。

    有人能解释一下这里发生了什么事吗?

    编辑1:

    #include <vector>
    int main()
    {
        std::vector<int> vec;
        vec.emplace_back(10);
    }
    

    编辑2:

    1 回复  |  直到 8 年前
        1
  •  8
  •   Pete Becker    8 年前

    在第34行有一条线索: call _Unwind_Resume . 从第28行到第34行的代码块用于在抛出异常时展开堆栈。正常代码路径在第25行通过析构函数调用,然后在第27行跳过异常代码,跳到第35行,然后从那里返回函数。

    澄清一下,这里有一种魔力:召唤 _Unwind_Resume

    推荐文章