为什么VC++要引入非标准关键字:__leave?

问题描述 投票:0回答:2

根据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
是最佳实践吗?

c++ c visual-c++ compiler-construction exception
2个回答
6
投票

发表此答案时标题为 “try-finally 语句 (C)” 的文章版本说:

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

编辑: 另外,避免使用编译器特定的功能通常是好的。


2
投票

这要看情况。

__try
/
__finally
是为 Win32 结构化异常处理而构建的,这与 C++ 结构化异常处理不太相同。如果您正在编写 Win32 驱动程序,则“必须”使用 Win32 SEH。如果没有,我会坚持使用 C++ EH。
© www.soinside.com 2019 - 2024. All rights reserved.