我有一个函数,我在其中调用getaddrinfo()
得到一个sockaddr*
其目标内存是由系统分配的。
许多人可能知道,您需要致电freeaddrinfo()
释放由 getaddrinfo() 分配的内存。
现在,在我的函数中,有几个地方可能会抛出异常,因为某些函数失败了。
我的第一个解决方案是合并freeaddrinfo()
到每个 if 块中。
但这对我来说确实很难看,因为无论如何我都必须在函数返回之前调用它,所以我想出了 SEH 的 try-finally...
但我遇到的问题是,不允许将 throw 语句编码到 __try-block 中
然后,我阅读了 msdn 并尝试将 throw 语句交换到从 __try-block 内调用的辅助函数中...瞧,编译器不再抱怨了...
这是为什么?这安全吗?这对我来说没有意义:/
Code:
void function()
{
//...
addrinfo* pFinal;
__try
{
getaddrinfo(..., &pFinal);
//if(DoSomething1() == FAILED)
// throw(exception); //error C2712: Cannot use __try in functions that require object unwinding
//but this works
Helper();
//...
}
__finally
{
freeaddrinfo();
}
}
void Helper()
{
throw(Exception);
}
EDIT:
尝试了以下方法,它适用于抛出整数,但当我使用类作为异常时则不起作用:
class X
{
public:
X(){};
~X(){};
};
void Helper()
{
throw(X());
}
void base()
{
__try
{
std::cout << "entering __try\n";
Helper();
std::cout << "leaving __try\n";
}
__finally
{
std::cout << "in __finally\n";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
try
{
base();
}
catch(int& X)
{
std::cout << "caught a X" << std::endl;
}
std::cin.get();
return 0;
}
Why? :/
您不能混合使用两种异常类型。在幕后,C++ 异常使用 SEH,而您的 SEH 异常处理程序可能会扰乱异常传播逻辑。因此,C++ 编译器不允许您混合它们。
PS:结构化异常处理几乎总是一个非常糟糕的主意。 Microsoft 内部已禁止使用 SEH,除非在非常有限的情况下。任何使用结构化异常处理的组件都会自动受到intense代码审查(我们有工具扫描代码以查找其用途,以确保不会遗漏任何情况)。
SEH 的问题在于,使用 SEH 时很容易意外引入安全漏洞。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)