0

VLD 2.4.0 を使用して、MFC x64 アプリでメモリ リークを検索しています。

CFileDialog を開こうとすると、CFileDialog が表示されるのを待つだけでアプリケーションがハングします (これは決して起こりません)。

コードに VLD ヘッダーを含めない場合、CFileDialog は期待どおりに動作します。これが私のコードです:

void CMainFrame::OnBtnOpen()
{
    // TODO: Add your command handler code here
    if (theApp.xAM->GetApplicationState() != idle)
    {
        return;
    }

    bool isFirst = true;        //czy aktualnie wczytana chmura byla pierwsza(potrzebne przy wczytywaniu wielu chmur na raz)

    CString csFilter = CMsg(ID_IMPORT_CLOUDS_OPEN_DIALOG_FILTER);

    CFileDialog OpenDialog(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, csFilter, this, 0, TRUE);
    UINT maxFiles = 50;
    UINT buffSize = maxFiles*(MAX_PATH + 1) + 1;
    CString buffer;
    OpenDialog.GetOFN().lpstrFile = buffer.GetBuffer(buffSize);
    OpenDialog.GetOFN().nMaxFile = buffSize;

    if (OpenDialog.DoModal() == IDOK) // HANGS ON THIS CALL
    {
        // set import path in data structure
        POSITION POS = OpenDialog.GetStartPosition();

        while (POS)     
        {
            CString strPath = OpenDialog.GetNextPathName(POS);

            std::wstring v_wsPath(strPath);

            theApp.xAM->SetImportPath(v_wsPath);

            DWORD thrdExitCode;
            WThreadParams_ImportCloud threadParams;

            if (isFirst)
            {
                //tworzy nowa grupe
                threadParams.iCloudIndex = -1;
                threadParams.iGroupIndex = -1;

                isFirst = false;
            }
            else
            {
                //dopisuje chmure do ostatniej grupy
                threadParams.iCloudIndex = -1;
                threadParams.iGroupIndex = theApp.xAM->GetGroupsCount() - 1;
            }

            theApp.StartWorkerThread(ImportPointCloudsThread, (WThreadParams*)(&threadParams), &thrdExitCode);

            reinterpret_cast<CSideDockablePane*>(theApp.GetSideDockablePane())->RepaintTree();

            theApp.xAM->FitDataToViewport(true);

            theApp.xAM->RenderScene(OpenGLRenderingCtx::eRM_STATIC);

            glFinish();
        }
    }

    reinterpret_cast<CSideDockablePane*>(theApp.GetSideDockablePane())->RepaintTree();
}

私にとって、これはかなり大きな問題です。なぜなら、それが私が自分のアプリにデータを入力する方法であり、メモリ リークについて他のアルゴリズムをテストできるからです。

VLD を CFileDialog と一緒に使用できるようにするための解決策はありますか?

4

0 に答える 0