free.c 抛出异常并带有"this program has stopped working"



当我使用Visual C 2010 Express的调试器运行程序(server.exe)时,它运行完美,但是当我以EXE运行时,它不会运行;它以" server.exe停止工作"对话框而崩溃。

接下来,我将EXE重命名为" ServerInstaller.exe",并且它起作用,所以我认为这是一个权限错误,但在Adminstrator模式下它不适用于" server.exe"。

i然后将VC 中的调试器附加到" server.exe"程序,并在" free.c"中提出了一个例外。

此文件中的代码为

void __cdecl _free_base (void * pBlock)
{
        int retval = 0;

        if (pBlock == NULL)
            return;
        RTCCALLBACK(_RTC_Free_hook, (pBlock, 0));
        retval = HeapFree(_crtheap, 0, pBlock);   // Exception thrown in this function
       if (retval == 0)
        {
            errno = _get_errno_from_oserr(GetLastError());
        }
}

例外是

server.exe中的0x770AE3BE的未经处理的异常:0xc0000005:访问 违规阅读位置0x3765f8c7。

我检查了pblock的值,它是0x007f82c0。

我的程序。

我的程序是Raknet服务器,并且刚刚成功删除了播放器。服务器正在此时检查Raknet的消息

堆栈跟踪返回

    ntdll.dll!770ae3be()    
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!770ae023()    
    kernel32.dll!75e814dd()     
>   msvcr100d.dll!_free_base(void * pBlock)  Line 50 + 0x13 bytes   C
    msvcr100d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse)  Line 1431 + 0x9 bytes  C++
    msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse)  Line 1265 + 0xd bytes C++
    msvcr100d.dll!free(void * pUserData)  Line 49 + 0xb bytes   C++
    RakNetDebug.dll!RakNet::_RakFree_Ex(void * p, const char * file, unsigned int line)  Line 165 + 0xc bytes   C++
    RakNetDebug.dll!RakNet::ReliabilityLayer::FreeInternalPacketData(RakNet::InternalPacket * internalPacket, const char * file, unsigned int line)  Line 3766 + 0x17 bytes C++
    RakNetDebug.dll!RakNet::ReliabilityLayer::RemovePacketFromResendListAndDeleteOlderReliableSequenced(RakNet::uint24_t messageNumber, unsigned __int64 time, DataStructures::List<RakNet::PluginInterface2 *> & messageHandlerList, const RakNet::SystemAddress & systemAddress)  Line 2391   C++
    RakNetDebug.dll!RakNet::ReliabilityLayer::HandleSocketReceiveFromConnectedPlayer(const char * buffer, unsigned int length, RakNet::SystemAddress & systemAddress, DataStructures::List<RakNet::PluginInterface2 *> & messageHandlerList, int MTUSize, unsigned int s, RakNet::RakNetRandom * rnr, unsigned short remotePortRakNetWasStartedOn_PS3, unsigned int extraSocketOptions, unsigned __int64 timeRead, RakNet::BitStream & updateBitStream)  Line 776   C++
    RakNetDebug.dll!RakNet::ProcessNetworkPacket(RakNet::SystemAddress systemAddress, const char * data, const int length, RakNet::RakPeer * rakPeer, RakNet::RakNetSmartPtr<RakNet::RakNetSocket> rakNetSocket, unsigned __int64 timeRead, RakNet::BitStream & updateBitStream)  Line 5012 C++
    RakNetDebug.dll!RakNet::RakPeer::RunUpdateCycle(unsigned __int64 timeNS, unsigned __int64 timeMS, RakNet::BitStream & updateBitStream)  Line 5099 + 0x81 bytes  C++
    RakNetDebug.dll!RakNet::UpdateNetworkLoop(void * arguments)  Line 5868  C++
    msvcr100d.dll!_callthreadstartex()  Line 314 + 0xf bytes    C
    msvcr100d.dll!_threadstartex(void * ptd)  Line 297  C
    kernel32.dll!75e833aa()     
    ntdll.dll!770b9ef2()    
    ntdll.dll!770b9ec5() 

如果您的指针具有值,并且您会收到这样的错误,则很可能意味着您尝试多次释放内存。检查代码,然后尝试查找您释放多少次。阻止此操作的一种方法是将指向指向的块后立即设置为零。

另一种可能性是,您没有使用MSVCRT,并且正在加载也不使用MSVCRT的DLL,并且分配发生在可执行文件或DLL中,而是在另一个中释放。

我遇到了这个问题,它不是用于多个删除,而是用于编译的问题(使用VisualStudio2012)我重新编译该程序,并解决了问题

重建项目可能对您有帮助。它对我有用

相关内容

最新更新