heap-Probleme mit std::vector und Visual Studio 2005 / 2008



  • Hallo,

    eigentlich eine einfache Geschichte und ich vermute auch schon, woran es liegt, möchte aber noch andere Meinungen hören. Folgendes Szenario:

    Ich habe eine Test-Applikation unter MFC, diese ruft eine Methode einer Klasse in einer DLL auf. Als einziges wird eine Referenz auf einen std::vector übergeben. In der Methode wird 1000 mal push_back() aufgerufen. Das wars dann auch. Hier mal ganz stark vereinfacht der Code:

    class CTest
    {
    public:
       virtual TestFunc( std::vector<int>& rviTest )
       {
           for ( int i=0; i<1000; i++ )
              rviTest.push_back( i );
       }
    };
    

    Die MFC Application kackt beim Verlassen der aufrufenden Methode (in dem fall der Document-Constructor) mit diesem Heap-Problem ab:

    Windows has triggered a breakpoint in Test.exe.

    This may be due to a corruption of the heap, and indicates a bug in Test.exe or any of the DLLs it has loaded.

    The output window may have more diagnostic information

    Hier der Code:

    CTestDoc::CTestDoc()
    {
        CTest cTest;
        std::vector<int> viTest;
        cTest.TestFunc( viTest );
    }
    

    Ausgangssituation ist, dass die DLL mit der Option Multi-threaded Debug DLL (/MDd) und die MFC-Applikation mit Multi-threaded Debug (/MTd) kompiliert ist.

    Wenn ich beide mit Multi-threaded Debug DLL (/MDd) kompiliere, dann ist der Fehler weg, es treten jedoch Memory Leaks auf. Diese jedoch müssen von anderen Bibliotheken kommen, die ich leider auch noch an die MFC-Applikation binden muss, unter anderen HDF5 und die PostGreSQL library.

    Bei diesen habe ich festgestellt, dass sie mit Visual Studio 2008 kompiliert wurden, meine Produkte jedoch mit Visual Studio 2005. Ich vermute jetzt, dass hier die unterschiedlichen Runtime-Libraries zu diesen Memory-Leaks führen. Ich will jetzt aber nicht Visual Studio 2008 neu kaufen, kost ja auch gleich ma 600,00 EUR. Daher möchte ich gerne Eure Meinung dazu hören. Danke!

    Saracaeus



  • Also die DLL und die .exe müssen schonmal beide die DLL Version der CRT verwenden wenn du std::vector und dergleichen grenzübergreifend verwenden willst.
    MFC Versionen zu mischen würde ich auch für eine ziemlich schlechte Idee halten.

    Was das Mischen von 2005er und 2008er Code angeht, das KANN funktionieren, allerdings nur wenn man das Interface über das die verschiedenen Codeteile miteinander plaudern stark einschränkt.
    z.B. sollten im Interface möglichst keine C++ Features verwendet werden:
    * STL/MFC/ATL Klassen sind im Interface sowieso komplett verboten.
    * Speicher muss von dem Compiler freigegeben werden wo er angefordert wurde.
    * Aufruf von virtuellen Funktionen ist normalerweise OK.
    * Die restlichen RTTI Features würde ich eher nicht grenzübergreifend verwenden wollen.
    * sizeof() von Klassen darf nur vom gleichen Compiler verwendet werden der auch den Code dieser Klasse erzeugt hat.
    uswufs.


Anmelden zum Antworten