Я запускаю приложение Visual C++ MFC в режиме выпуска. Я собираю все, используя Visual Studio 2010.Указатель объекта случайным образом указывает на 0x00000
Мое приложение запускает мини-станцию с ЧПУ через USB VCP-связь.
У меня есть файл XML, в котором хранятся настройки приложения.
Моя проблема заключается в следующем: ocassionaly (и это повторяемо) указатель на tinyxml2 :: XMLDocument, который я использую, устанавливается в 0x000.
Информация:
Иногда файл XML пишутся в то время как мельница работает.
Перед тем, как произошла ошибка, мельница, в которой я запускаю siezes почти 30 секунд.
Я использую блокировки мьютекса, чтобы убедиться, что xmldoc не записывается дважды в файл.
Замки мьютексов работают, и ошибка мьютекса никогда не возникает. Я знаю, что код мьютекса не идеален, но это не проблема. Честный.
Я никогда не пишу в указатель xmldoc, кроме случаев, когда родительский класс загружается.
И вдруг внезапно указатель xmlDoc устанавливается в ноль.
Любые мысли кто-нибудь?
Вот моя экономия кода, хотя проблема может лежать в другом месте:
void XMLSettings::SaveToXML()
{
HANDLE g_Mutex = CreateMutex(NULL, TRUE, "XMLSavingMutex");
DWORD wait_success = WaitForSingleObject(g_Mutex, 30000L);
if(wait_success == WAIT_OBJECT_0){
CIsoProApp* pApp = (CIsoProApp*)AfxGetApp();
if(PathFileExists(pApp->DrivePath + "IsoPro\\temp.xml"))
{
DeleteFile(pApp->DrivePath + "IsoPro\\temp.xml");
}
if(0==&xmlDoc)
{
OutputDebugString("xmlDoc == NULL");
}
int errorcode = xmlDoc->SaveFile(pApp->DrivePath + "IsoPro\\temp.xml");
if(errorcode != 0)
{
OutputDebugString("xmlDoc == errorcode");
}
if(0==&xmlDoc)
{
OutputDebugString("xmlDoc == NULL2");
}
if(0==xmlDoc)
{
OutputDebugString("xmlDoc == NULL");
}
if(PathFileExists(pApp->DrivePath + "IsoPro\\Settings.xml"))
{
DeleteFile(pApp->DrivePath + "IsoPro\\Settings.xml");
}
MoveFile(pApp->DrivePath + "IsoPro\\temp.xml",pApp->DrivePath + "IsoPro\\Settings.xml");
ReleaseMutex(g_Mutex);
}
else
{
int errorInt = GetLastError();
CString error;
error.Format("%d",errorInt);
if(errorInt != ERROR_ALREADY_EXISTS)
{
AfxMessageBox("XMLSavingMutex Error. WaitSuccess = " + wait_success);
AfxMessageBox("XMLSavingMutex Error. GetLastError = " + error);
}
}
CloseHandle(g_Mutex);
}
Если у вас несколько потоков, вызывающих 'SaveToXML', возможно, вы должны сделать mutex' static'. Кроме того, какую версию визуальной студии вы используете? Здесь мы можем использовать более стандартизованные функции синхронизации потоков. – AndyG
Как сказал AndyG - вы не хотите создавать/уничтожать мьютексы, вам нужен один экземпляр, который вы блокируете и разблокируете. – UKMonkey
Вы можете настроить точку останова данных в Visual Studio. Таким образом, вы можете найти, когда ваш указатель окажется недействительным. – Ari0nhh