QT _CrtIsValidHeapPointer(pUserData)



  • Entschuldigt bitte die etwas seltsame Überschrift, aber ich bin mir gerade selbst nicht klar, was hier verkehrt läuft.
    Mal ein paar Rahmeninfos:
    Ich habe ein QT Programm, welches ich gerade ein wenig am umschreiben, bzw redesignen, bin. Es gibt dabei auch eine von mir selbst erstellte lib. Das ganze geschieht in c++. Multithreading gibt es nicht.

    Erstmal ein Stückchen Code:

    bool MainWindow::_loadDB(const std::string &projectPath)
    {
        // ToDo: load complete databases
        TilePrototypeDatabasePtr tileDB(new TileDatabase());
        TileDatabaseXMLReader tileReader(tileDB);
        if (!m_pDBMgr || !tileReader.readFile(projectPath + TILE_DATABASE_PATH))
            return false;
        m_pDBMgr->setTileDatabase(tileDB);
        return true;
    }
    
    bool MainWindow::_loadProject(const std::string &sDir)
    {
        if (_loadDB(sDir))
        {
            Config::Get()->setProjectDirectory(sDir);
            BASIC_LOG("Successfully load " + sDir + ".");
            //emit projectLoadDone();
            return true;
        }
        QErrorMessage *pMsg = new QErrorMessage(this);
        pMsg->showMessage(QString::fromStdString(sDir + " is no valid project directory."));
        BASIC_LOG("Unable to load " + sDir + ". Corrupt project or no such directory.");
        Config::Get()->clear();
        return false;
    }
    
    void MainWindow::_loadProject()
    {
        QDir curDir = QDir::current();
        QString sFileName = QFileDialog::getExistingDirectory(this, tr("Open Project"), curDir.path()+"/projects", QFileDialog::ShowDirsOnly);
        if (sFileName.isEmpty())
            return;
    
        _closeProject();
        std::string temp = sFileName.toStdString();
        if (_loadProject(temp))
            int x = 0;
    }
    

    _loadProject() wird durch eine Action meines MainMenus über eine Signal/Slot Verbindung aufgerufen. Nun öffne ich eine FileDialog und lade meine Database in den Speicher. Soweit passt das auch alles. Nur tritt nun jedes mal, wenn ich mit dem Laden fertig bin eine Fehlermeldung auf.

    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Assertion Failed!

    Program: ...sual Studio 2008\Projects\Simple2D-Engine\Debug\MapEditor.exe
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
    Line: 1317

    Expression: _CrtIsValidHeapPointer(pUserData)

    For information on how your program can cause an assertion
    failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)
    ---------------------------
    Abbrechen Wiederholen Ignorieren
    ---------------------------

    Es passierte zuerst, als das Programm aus "bool MainWindow::_loadProject(const std::string &sDir)" zurück gekehrt ist. Jetzt, seit dem ich den QString in einen temporären std::string umwandle, passiert es beim returnen aus "bool MainWindow::_loadProject()" (deswegen auch das "int x = 0;").
    Wird die funktion vorzeitig returned, passiert nichts. Rufe ich "bool MainWindow::_loadProject(const std::string &sDir)" direkt auf, läuft auch alles Einwand frei. _closeProject() hatte ich auch schon auskommentiert.

    Folgendes ist mein Stack:
    http://share.cherrytree.at/showfile-9229/fehler.png
    Jedenfalls weiß ich nicht, was hier eigentlich schief läuft, da ich weder manuell speicher auf dem heap reserviere, noch freigebe (abgesehen von new TileDatabase(), was aber dann doch an einen boost::shared_pointer übergeben wird).
    Hat hier jemand eine Idee?

    mfg

    edit: bei ein wenig recherche, fand ich eigentlich nur die Erklärung, das ich ein object, das in einer DLL erstellt wurde, nur in der selbigen auch löschen darf/kann. Aber letztendlich nutze ich nur die QT DLLs und greife hier auch nicht selbst in den Speicher ein.

    Windows hat einen Haltepunkt in MapEditor.exe ausgelöst.

    Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in MapEditor.exe oder in einer der geladenen DLLs hinweist.

    Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während MapEditor.exe den Fokus hat.

    Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.

    das ist die erste fehlermeldung, wenn ich darüber hinaus weg steppe. Die Klasse, in der der Fehler ein tritt ist "QHash", weswegen ich das hier auch nicht im c++ Forum gepostet habe. der key ist mein QAction, das den Project load aufruft.

    edit2:
    auch ein Versuch das ganze über ein anderes Object aufrufen zu lassen schlug fehl.

    edit3:
    der versuch nur "bool MainWindow::_loadProject(const std::string &sDir)" aufzurufen ist geglückt. Kann hier also einen Fehler ausschließen!



  • problem gelößt.
    lag daran, das ich als multithreaded-debug kompiliert habe, und nicht als multithreaded-debug-dll.


Anmelden zum Antworten