代码之家  ›  专栏  ›  技术社区  ›  Alexandre C.

离开一个块:是否调用析构函数?

  •  39
  • Alexandre C.  · 技术社区  · 14 年前

    请考虑以下代码:

    void foo()
    {
        {
            CSomeClass bar;
    
            // Some code here...
    
            goto label;
    
            // and here...
        }
    
    label:
        // and here...
    }
    

    会调用bar的析构函数吗?

    4 回复  |  直到 11 年前
        1
  •  55
  •   anon    14 年前

    C++标准说:

    退出作用域时(但是 完成),析构函数(12.4)为 调用所有构造的对象 具有自动存储时间 (3.7.2)(命名对象或临时对象) 在该范围内声明的,在 它们的相反顺序 宣言。

    所以答案是“是”。

        2
  •  23
  •   Viktor Sehr    14 年前

    是的,他们会被叫来的。

    更新: (这样做没关系,gotos并不比抛出假异常或使用bools/ifs来摆脱事情更糟糕。函数内部的一个简单Goto不会使其成为意大利面条代码。)

        3
  •  9
  •   jwismar    14 年前

    1)是的。 2)不要这样做。

    精化:从概念上讲,这与通过 break . goto 然而,强烈、强烈地反对。几乎没有必要使用 古托 任何使用都应仔细检查,以查明发生了什么。

        4
  •  4
  •   Jeff Walden    11 年前

    是的,正如其他人所说。C++指定/授权这一点。

    但为了完整起见,还要补充一点:如果 goto 使用计算的- 古托 在一些编译器中找到扩展——gcc、clang,可能还有其他编译器,但是 包括我最后知道的MSVC——对象的析构函数是否会被调用是相当模糊的。当A 古托 转到单个位置,很清楚在控制流传输之前必须调用哪些析构函数。但是有一个计算 古托 ,可能需要动态调用不同的析构函数,以给出“预期的”语义。在这些情况下,我不确定实现这个扩展的编译器会做什么。我的记忆是,当一个计算机- 古托 可能会在作用域中留下一个具有非三值析构函数的对象,声称不会调用析构函数。在某些情况下可能会很好,而在其他情况下则不会。我不知道其他编译器会做什么。如果你想用计算机 古托 与具有非平凡析构函数的对象一致。