смешивание обработки исключений C ++ и SEH (windows)

У меня есть функция, в которой я вызываю 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;
}

Почему? : /

5
задан Incubbus 15 July 2011 в 15:11
поделиться