为什么VC ++引入了非标准关键字:__ leave?

时间:2013-09-16 01:20:31

标签: c++ c visual-c++ compiler-construction exception-handling

根据MSDN

  

__leave语句更有效,因为它不会导致   堆栈展开。

据我所知,就是说:“这样一个常见的代码片段是危险的!”

struct A
{
    int* p;

    A() : p(new int) {}
    ~A() { delete p; }
};

void f()
{
    __try
    {
        A a;
        ... // Doing somthing
        if (the thing has gone bad) __leave;
        ... // Continue
    }
    __finally
    {}
}

在C ++项目中完全避免__leave是最佳做法吗?

2 个答案:

答案 0 :(得分:5)

http://msdn.microsoft.com/en-us/library/yb3kz605.aspx

表示:

  

对于C ++程序,应该使用C ++异常处理而不是结构化异常处理。有关更多信息,请参阅C ++语言参考中的异常处理。

编辑: 此外,通常不要使用编译器特定的功能。

答案 1 :(得分:2)

这取决于。 __try / __finally是为Win32结构化异常处理而构建的,它与完全相同与C ++结构化异常处理相同。如果您正在编写Win32驱动程序,则必须使用Win32 SEH。如果没有,我会坚持使用C ++ EH。