intermixing c++ exception handling and SEH (windows)

前端 未结 3 1106
不知归路
不知归路 2021-02-10 00:25

I have a function in which I call getaddrinfo() to get an sockaddr* which targets memory is allocated by the system. As many may know, you need to call

相关标签:
3条回答
  • 2021-02-10 00:57

    You can't mix the two exception types. Under the covers, C++ exceptions use SEH and your SEH exception handler could mess up the exception propogation logic. As a result, the C++ compiler won't allow you to mix them.

    PS: Structured Exception Handling is almost always a VERY bad idea. Internally Microsoft has banned the use of SEH except in very limited circumstances. Any component that does use structured exception handling is automatically subject to intense code reviews (we have tools that scan code looking for its use to ensure that no cases are missed).

    The problem with SEH is that it's extremely easy to accidentally introduce security vulnerabilities when using SEH.

    0 讨论(0)
  • 2021-02-10 01:09
    catch(int& X)
    {
        std::cout << "caught a X" << std::endl;
    }
    

    That doesn't catch an X, it catches an int&. Since there is no matching catch block, the exception is uncaught, stack unwinding doesn't occur, and __finally handlers don't run.

    You can put catch (...) in your thread entrypoint (which is main() for the primary thread) in order to make sure that stack unwinding occurs, although some exceptions are unrecoverable, that's never true of a C++ exception.

    0 讨论(0)
  • 2021-02-10 01:12

    You could wrap the addrinfo in a class that calls getaddrinfo in the constructor and freeaddrinfo in its destructor.

    That way it will always be freed, whether there is an exception thrown or not.

    0 讨论(0)
提交回复
热议问题