istura de manipulação de exceção c ++ e SEH (windows)

Tenho uma função na qual chamogetaddrinfo() para obter umsockaddr* que tem como alvo a memória é alocada pelo sistema. Como muitos sabem, você precisa ligar parafreeaddrinfo() para liberar a memória alocada por getaddrinfo ().

Agora, na minha função, existem alguns lugares em que posso lançar uma exceção, porque alguma função falhou. Minha primeira solução foi incorporar ofreeaddrinfo() em cada bloco if. Mas isso me pareceu feio, porque eu teria que chamá-lo de qualquer maneira antes que minha função retornasse, então eu vim com a tentativa de SEH finalmente ...

Mas o problema que encontrei é que não é permitido codificar as instruções throw no __try-block

Então, li no msdn e tentei trocar as instruções throw para a função helper chamada de dentro do __try-block ... e pronto, o compilador não gemeu mais ...

Por que é que? E isso é seguro? Isto não faz sentido para mim :

Código

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);
}

EDITAR

tentou o seguinte e funciona com o lançamento de um número inteiro, mas não quando eu uso uma classe como uma exceção:

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;
}

Por quê? : /

questionAnswers(3)

yourAnswerToTheQuestion