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

xml*_*lmx 4 c c++ compiler-construction exception-handling visual-c++

根据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
    {}
}
Run Code Online (Sandbox Code Playgroud)

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

Cra*_*mer 6

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

说:

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

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

  • 另外:*虽然 Windows 和 Visual C++ 支持结构化异常处理 (SEH),但我们建议您使用 ISO 标准 C++ 异常处理,因为它使代码更加可移植和灵活。然而,在现有代码或特定类型的程序中,您可能仍然需要使用 SEH.* (http://msdn.microsoft.com/en-us/library/swezty51.aspx) (2认同)