对象指针随机指向0x00000

时间:2016-10-18 15:00:38

标签: c++ visual-c++ tinyxml

我正在发布模式下运行Visual C ++ MFC应用程序。我正在使用Visual Studio 2010编译所有内容。

我的应用程序通过USB VCP通信运行迷你CNC铣床。

我有一个存储应用程序设置的XML文件。

我的问题是:ocassionaly(这是可重复的)指向我正在使用的tinyxml2 :: XMLDocument的指针设置为0x000。

的信息:

有时,在工厂运行时会写入XML文件。

在错误发生之前,我正在运行的磨机扫描了近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);
}

2 个答案:

答案 0 :(得分:1)

由于您每次调用 SaveToXML似乎都在创建互斥锁,因此您应该将呼叫更改为

HANDLE g_Mutex = CreateMutex( NULL, FALSE, "XMLSavingMutex");

执行此操作将创建一个命名的互斥锁,允许实现指定所有者是谁;其他线程将收到相同的互斥锁。

来自doc

  

两个或多个进程可以调用CreateMutex来创建相同的命名互斥锁。第一个进程实际上创建了互斥锁,具有足够访问权限的后续进程只需打开现有互斥锁的句柄。这使得多个进程可以获得相同互斥锁的句柄,同时使用户无需确保首先启动创建过程。使用此技术时,应将bInitialOwner标志设置为FALSE;否则,可能很难确定哪个流程具有初始所有权。

(归功于WhozCraig指出了指定的互斥锁)

答案 1 :(得分:0)

在将xml写入文件时,我似乎正在访问xml getter。我为所有xml操作放置了一个互斥锁,事情似乎正常运行。感谢大家的帮助。如果可用,我会与更多信息保持联系。