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