当我使用Visual C ++ 2010 Express的调试器运行程序(server.exe)时,它运行完美,但是当我以exe运行它时它没有;它崩溃了“Server.exe已停止工作”对话框。
接下来我将exe重命名为“ServerInstaller.exe”并且它有效,所以我认为这是一个权限错误,但它在管理员模式下不能与“Server.exe”一起使用。
然后我将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:Access 违规阅读地点0x3765f8c7。
我检查了pBlock的值,它是0x007f82c0。
我的计划。
我的程序是RakNet服务器,并且已成功删除了一个播放器。 服务器正在检查来自RakNet的消息
Stack Trace back
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()
答案 0 :(得分:6)
如果你的指针有一个值,并且你得到这样的错误,很可能意味着你试图多次释放内存。检查代码,并尝试查找您释放的次数。停止此操作的一种方法是在释放指向的块后立即将指针设置为零。
另一种可能性是,你没有使用msvcrt并且你正在加载一个也没有使用msvcrt的DLL,并且分配发生在可执行文件或DLL中,并在另一个中释放。
答案 1 :(得分:0)
我遇到了这个问题而且不是为了多次删除,而是为了编译问题(使用VisualStudio2012) 我重新编译程序,问题解决了
答案 2 :(得分:0)
重建项目可能对你有帮助。它为我工作