Der STL ein __declspec(dllexport) verpassen



  • Ich denke jeder kennt das Problem wenn man sich eine kleine Bibliothek schreibt und dabei gebrauch von der STL macht, und seine Bilbiothek dann in eine DLL verpackt. Nun hat man z.B. einen Rückgabetyp von std::string oder std::vector, und sobald das Objekt zerstört wird, gibt es eine Heap Fehlermeldung.

    Die einfachste Möglichkeit dieses Problem zu umgehen ist, die STL nicht zu benutzen und sich eigene Klassen zu erstellen. Was aber viel zu viel Arbeit ist und noch dazu Fehleranfällig und oft langsamer.

    Zweite Möglichkeit währe es wie in C zu machen, und z.B. ein char* zurückgeben. Aber bei den vector oder map Klassen ist es dann nicht mehr ganz so einfach.

    Aber es gibt ja noch eine Dritte Möglichkeit 🙂 Man kann sich z.B. einen eigenen Allokator schreiben, und ihm dann ein __declspec(dllexport) verpassen, und der Heap Fehler ist damit weg. Nun bei der std::string Klasse ist es nicht so schwer. Hier geht es z.B. ganz einfach so

    typedef std::basic_string<char, std::char_traits<char>, MyAllocator<char> > string;
    

    Aber wie bekomme ich das z.B. mit std::vector hin. Eine Typ Definition mit typedef geht hier ja nicht. Da man ja einen festen Template-Wert angeben muss.

    Meine Frage ist nun, wie macht ihr das und gibt es eine besser Lösung als sich Wrapper-Klassen zu schreiben?



  • Das funktioniert definitiv ohne solche Verrenkungen.



  • Funktioniert das dann eigentlich nur wenn exakt der gleiche Compiler mit exakt der gleichen Implementierung der STL verwendet wird ?



  • Original erstellt von Knuddlbaer:
    Funktioniert das dann eigentlich nur wenn exakt der gleiche Compiler mit exakt der gleichen Implementierung der STL verwendet wird ?

    ist doch egal. man setzt die stl ja nicht wirklich deshalb ein, daß der code nachher auf ner anderen maschine mit nem anderen compiler laufen würde.
    und selbst wenn, ein paar defines und die sachen klappt auf der eigenen maschine und auf fremden isse leicht anpaßbar.
    nee. man verwendet die stl deshalb, weil die lieben kollegen sie kennen. man kann stl-container prima als schnittstellen verwenden und so.



  • natürlich nicht.



  • Auch wenns nu kein C++ Standard mehr ist,

    ich frage weil es interesannt wäre ne DLL zu erstellen die dann unter VC und BC laufen soll und stl Objekte als schnitstelle haben. Ich habs nicht ausprobiert, deswegen die doofe Frage ob das gehen würde !?



  • die dll muss neu kompiliert werden, dann gehts natürlich



  • k thx



  • wo ist volkards beitrag?



  • Original erstellt von <confused>:
    wo ist volkards beitrag?

    wegen unfugs gelöscht.



  • Das funktioniert definitiv ohne solche Verrenkungen.

    Das ist gut zu hören, das es auch einfacher geht 🙂 aber es währe auch ganz nett gewesen wenn Du mir einen Tipp geben könntest, wie man es besser machen kann.

    Das meine Lösung nicht so das wahre ist, hab ich mir auch schon gedacht. Aber wenigsten hab ich dabei etwas gelernt 😉 das ist ja auch schon mal was. 🙂



  • mach doch mal ein beispiel wo es bei dir nicht funktioniert. ich bin doch kein hellseher 🙂



  • 🙂

    na zum Beispiel so was:
    DLL Code

    #include <vector>
    std::vector<int> __declspec(dllexport) getVector()
    {
    std::vector<int> t;
    t.push_back(100);
    t.push_back(200);
    t.push_back(300);
    return t;
    }
    

    EXE Code

    int mein(void)
    {
    std::vector<int> i = getVector();
    
    return 0;
    } // Heap Fehler durch die Zerstörung von "i"
    

    Kurz gesagt, jedesmal wenn ich ein STL-Objekt in der DLL verändere oder erstelle und es dann von der EXE aus zerstört wird, bekomme ich halt den Heap-Fehler. Obiges ist so ein Typische Beispiel dafür. Der Compiler wirft dann auch immer eine Warunung aus, das std::vector keine DLL-Anbindung hat. Sobald ich z.B. std::vector eine solche zuweise ist der Heap-Fehler schon weg 😉

    Es ist nun die Frage wie man das am einfachsten hinbekommt, den STL-Objekten eine DLL-Anbindung zu verpassen.



  • Baust du dein Programm mit Visual C++?
    Ich habe (mit Version 6.0) einen ähnlichen Fehler bei Verwendung von Maps und Sets gehabt. Dies ist ein Bug in der von VC++ verwendeten STL-Implementierung. Unter http://www.dinkumware.com/vc_fixes.html findest du Patches hierzu. Bei mir hat es genügt, die Dateien dequeue, xstring und xtree herunterzuladen und die gleichnamigen Dateien von VC++ durch die neuen zu ersetzen, dann trat der Fehler nicht mehr auf.

    Stefan.



  • Es muß natürlich "deque" heißen.....

    Stefan.



  • Diese Fixes sind jedoch für VC++ 5 und 6. Ich Arbeite hingegen mit VC++ 7 oder auch .NET genannt 😉



  • Moin,

    schau mal hier:
    Debug Assertion failed bei delete



  • Danke 🙂 das war der entscheidende Tipp


Log in to reply