У меня есть функция, в которой я вызываю getaddrinfo ()
, чтобы получить sockaddr *
, который предназначен для памяти, выделенной системой.
Как многие могут знать, вам нужно вызвать freeaddrinfo ()
, чтобы освободить память, выделенную getaddrinfo ().
Теперь в моей функции есть несколько мест, где я могу вызвать исключение, потому что какая-то функция вышла из строя.
Моим первым решением было включить freeaddrinfo ()
в каждый if-блок.
Но для меня это выглядело некрасиво, потому что мне пришлось бы вызывать его в любом случае до того, как моя функция вернется, поэтому я придумал SEH try-finally ...
Но проблема, с которой я столкнулся, заключается в том, что это не разрешено закодировать операторы throw в блоке __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;
}
Почему? : /