我有一个函数,我调用它getaddrinfo()
来获取sockaddr*
系统分配的目标内存。许多人可能知道,您需要调用freeaddrinfo()
以释放由 getaddrinfo() 分配的内存。
现在,在我的函数中,有几个地方我可能会抛出异常,因为某些函数失败了。我的第一个解决方案是将其合并freeaddrinfo()
到每个 if 块中。但这对我来说确实很难看,因为无论如何我都必须在函数返回之前调用它,所以我想出了 SEH 的 try-finally ......
但是我遇到的问题是,不允许将 throw-statements 编码到 __try-block
然后,我在 msdn 上阅读并尝试将 throw 语句交换到从 __try-block 中调用的辅助函数中......瞧,编译器不再抱怨它了......
这是为什么?这安全吗?这对我来说没有意义:/
代码:
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);
}
编辑:
尝试了以下方法,它适用于抛出一个整数,但当我使用一个类作为异常时不起作用:
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;
}
为什么?:/