【发布时间】:2013-09-16 01:20:30
【问题描述】:
根据MSDN:
__leave 语句效率更高,因为它不会导致 堆栈展开。
据我理解,就是说:“这么普通的代码sn-p是危险的!”
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 是最佳做法吗?
【问题讨论】:
-
实际上,我认为使用 ISO C++ 标准之外的 anything 可能 是邪恶的 - 它使移植更加困难。在您的特定情况下,这可能不是问题,但有些人重视它。
-
__try,__except,__leave和__finally用于结构化异常处理,这是一种特定于 Windows 的功能,具有非常特殊的用途(例如,捕获堆栈保护页面异常、访问冲突和公司);对于“常规”C++,你不需要它们。 -
关键是抱怨
__try...__except就像抱怨CreateWindow不可移植——当然不是,它旨在处理非常特定于操作系统的东西首先,甚至 Microsoft 都告诉您避免在 C++ 中使用__try,除非您确实需要使用 SEH。 SEH 不是标准中已有内容的非标准替代品,它用于标准准确避免谈论的内容,因为它不能以与平台无关的方式处理。跨度> -
@DietrichEpp 我不明白关于“支持标准库”的部分。除了标准语言之外,标准库不需要任何支持。
-
@EJP:它在 CRT 内部被广泛使用(在 CRT 源代码上的快速
grep -r __try | wc -l显示了__try的 171 个实例)来处理特定于 Windows 的内容并构建我们漂亮的 C/C++ 库对其进行抽象。可以只使用 SEH Windows 函数来完成吗?当然,但由于__try已经存在(在处理上述场景以及驱动程序编程时,它对 VC++ 用户非常有用)并且比替代方案更方便,所以他们使用了它。同样,我同意你的观点,它对于 CRT 不是必需的,但它实际上 用于支持它。
标签: c++ c visual-c++ compiler-construction exception-handling