C++ Visual Studio 2013 展开对象

标签 c++ compiler-errors try-catch

好吧,我正在尝试构建这行代码,但是我遇到了编译器错误。我试过在没有编译器的情况下进行构建,但这也没有用。它是关于 __try__except 的。有人告诉我将 try block 中的代码移动到另一个函数。但我不明白这一点:

Error 12 error C2712: Cannot use __try in functions that require object unwinding

Error 437 error LNK1181: cannot open input file

void MSocketThread::Run()
{
    __try{
        //throw(pThread);
        while (true) {  // Waiting for SafeUDP Settting...
            DWORD dwVal = WaitForSingleObject(m_KillEvent.GetEvent(), 100);
            if (dwVal == WAIT_OBJECT_0) {
                return;
            }
            else if (dwVal == WAIT_TIMEOUT) {
                if (m_pSafeUDP)
                    break;
            }
        }

    WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];
    WORD wEventIndex = 0;

    bool bSendable = false;
    WSANETWORKEVENTS NetEvent;
    WSAEVENT hFDEvent = WSACreateEvent();
    EventArray[wEventIndex++] = hFDEvent;
    EventArray[wEventIndex++] = m_ACKEvent.GetEvent();
    EventArray[wEventIndex++] = m_SendEvent.GetEvent();
    EventArray[wEventIndex++] = m_KillEvent.GetEvent();

    WSAEventSelect(m_pSafeUDP->GetLocalSocket(), hFDEvent, FD_READ | FD_WRITE);

    while (TRUE) {
        DWORD dwReturn = WSAWaitForMultipleEvents(wEventIndex, EventArray, FALSE, SAFEUDP_SAFE_MANAGE_TIME, FALSE);
        if (dwReturn == WSA_WAIT_TIMEOUT) {                 // Time
            m_pSafeUDP->LockNetLink();
            SafeSendManage();
            m_pSafeUDP->UnlockNetLink();
        }
        else if (dwReturn == WSA_WAIT_EVENT_0) {            // Socket Event
            WSAEnumNetworkEvents(m_pSafeUDP->GetLocalSocket(), hFDEvent, &NetEvent);
            if ((NetEvent.lNetworkEvents & FD_READ) == FD_READ) {
                //              OutputDebugString("SUDP> FD_READ \n");
                m_pSafeUDP->LockNetLink();
                Recv();
                m_pSafeUDP->UnlockNetLink();
            }
            if ((NetEvent.lNetworkEvents & FD_WRITE) == FD_WRITE) {
                bSendable = true;
                //              OutputDebugString("SUDP> FD_WRITE \n");
            }
        }
        else if (dwReturn == WSA_WAIT_EVENT_0 + 1) {        // ACK Send Event
            //          OutputDebugString("SUDP> ACK_EVENT \n");
            FlushACK();
        }
        else if (dwReturn == WSA_WAIT_EVENT_0 + 2) {        // Packet Send Event
            //          OutputDebugString("SUDP> SEND_EVENT \n");
            if (bSendable == true)
                FlushSend();
        }
        else if (dwReturn == WSA_WAIT_EVENT_0 + 3) {        // Kill the Thread
            break;  // Stop Thread
        }
    }

    WSACloseEvent(hFDEvent);

    // Clear Queues
    LockSend();
    {
        for (SendListItor itor = m_SendList.begin(); itor != m_SendList.end();) {
            delete (*itor);
            itor = m_SendList.erase(itor);
        }
    }
    {
        for (SendListItor itor = m_TempSendList.begin(); itor != m_TempSendList.end();) {
            delete (*itor);
            itor = m_TempSendList.erase(itor);
        }
    }
    UnlockSend();

    LockACK();
    {
        for (ACKSendListItor itor = m_ACKSendList.begin(); itor != m_ACKSendList.end();) {
            delete (*itor);
            itor = m_ACKSendList.erase(itor);
        }
    }
    {
        for (ACKSendListItor itor = m_TempACKSendList.begin(); itor != m_TempACKSendList.end();) {
            delete (*itor);
            itor = m_TempACKSendList.erase(itor);
        }
    }
    UnlockACK();
}
__except (this->CrashDump(GetExceptionInformation()))

最佳答案

基本上,SEH 和 C++ 展开并不完全兼容;它们要求编译器在机器代码级别修改函数,而 MS 显然决定不支持同时对两者进行修改,因此任何函数只能支持 SEH 展开操作(__except 或 __finally)或 C++ 展开操作(捕获或带有析构函数的对象)。

我怀疑你的问题是循环中的迭代器;他们可能有析构函数。尽管迭代器通常很简单并且不需要析构函数,但调试迭代器并非如此,调试迭代器通常在构造时注册它们的存在并在销毁时注销它,以检测无效的迭代器和其他无效使用。

通常的解决方法是拆分函数。让你的运行函数只包含这个:

void MSocketThread::Run()
{
    __try {
      RunNoSeh();
    } __except (this->CrashDump(GetExceptionInformation())) {
    }
}
void MSocketThread::RunNoSeh()
{
    // Code that was inside the __try goes here.
}

关于C++ Visual Studio 2013 展开对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33298033/

相关文章:

r - Try Catch 未捕获 "error : unknown IO error"- I/O 警告 : failed to load external entity

C++ `operator function_type()` 这样的事情可能吗?

qt - 带有OpenCV库的编译错误Qt Creator(ubuntu)

.net - .NET 中 OutOfMemoryException 的 try/catch block 的设计模式

c++ - 从谷歌日志库的 CHECK 宏中捕获 C++ 异常

c++ - 如何专门针对特定类型的模板类方法?

C++ 在没有 CLR 的情况下读/写 XML

c++ - 不知道如何正确解析 typedef

c++ - progam (C++ ABI 1002) 和 lib (C++ ABI 1009) 构建版本 : 之间不匹配

c++ - 统计段落中出现次数最多的词