free.c выдает исключение с «эта программа перестала работать»

Когда я запускаю программу (server.exe) с помощью отладчика Visual C ++ 2010 Express, она работает отлично, но когда я запускаю ее как exe, она не работает; происходит сбой при появлении диалога «Server.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());
}
}

Исключение составляет

Необработанное исключение в 0x770ae3be в Server.exe: 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()

4

Решение

Если у вашего указателя есть значение, и вы получаете такую ​​ошибку, скорее всего, это означает, что вы пытаетесь освободить память несколько раз. Проверьте код и попробуйте узнать, сколько раз вы освобождаете. Один из способов остановить это — установить указатель сразу после освобождения блока, на который он указывает, на ноль.

Другая возможность заключается в том, что вы не используете msvcrt и загружаете библиотеку DLL, которая также не использует msvcrt, и выделение происходит либо в исполняемом файле, либо в DLL, а освобождается в другом.

6

Другие решения

У меня была эта проблема, и это было не для многократного удаления, а для проблемы при компиляции (с использованием VisualStudio2012)
Я перекомпилирую программу и проблема была решена

0

Восстановление проекта может вам помочь. Это сработало для меня

0
По вопросам рекламы [email protected]