[Visual C++ 6] STL vs. DLLs



  • Hi!

    Ich habe ein Projekt das sehr stark auf PlugIns basiert. PlugIns basieren auf DLLs und ich arbeite mit std::string.

    Jede DLL bekommt einen Zeiger auf ein Objekt (Typ ist eine eigene Klasse Model) das ich in der Hauptapplikation mit new erzeuge. Von den jeweiligen DLLs aus rufe ich Methoden auf, um neue Objekte zu Erzeugen die in einen internen Baum in dieser Klasse Model eingehängt werden.

    Wenn ich die Hauptapplikation beende kriege ich jedoch Debug Assertions... 😕

    Ich denke das liegt an den verschiedenen Heaps die ich benutze, da jede DLL eine eigene CRT nutzt (oder?)

    Wie kann ich die CRT dynamisch linken? Ich hab mal bei den Compileroptionen alles auf Debug Mulithreaded DLL (für CRT) gestellt, das bringt leider nichts.

    Kann mir jemand genau sagen was ich einstellen muss um dieses Problem zu umgehen? Oder an was könnte sowas sonst liegen?`

    Vielen Dank,

    Thomas



  • Hast du schon mal geguckt, was die Assertions zu meckern haben?
    Drück doch mal "Wiederholen". 🙄



  • Ja,
    http://tinypic.com/be60j5.jpg <- Screenshot

    Er räumt mir vorher auch noch schön den Speicher auf. Geh ich mit dem Debugger ans Ende des Programms... -> Assertion.

    Und dann ab in den Assembler. -> User Breakpoint Called From...



  • Was passiert, wenn du in der Meldung, die du fotografiert hast, Wiederholen drückst.
    Der Code ist interessant!



  • naja, ich krieg die assertion, im anschluss gehts in den assembler code, INT 3. ...

    Keine Ahnung 🙂



  • Und wie sieht es in der Aufrufliste aus?



  • Wie vermutet,.... der std::string macht Probleme 😕

    NTDLL! 77f65a58()
    NTDLL! 77f7c366()
    KERNEL32! 77e4c75a()
    _CrtIsValidHeapPointer(const void * 0x02210640) line 1697
    _free_dbg_lk(void * 0x02210640, int 1) line 1044 + 9 bytes
    _free_dbg(void * 0x02210640, int 1) line 1001 + 13 bytes
    free(void * 0x02210640) line 956 + 11 bytes
    operator delete(void * 0x02210640) line 7 + 9 bytes
    std::allocator<char>::deallocate(void * 0x02210640, unsigned int 33) line 64 + 38 bytes
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy(unsigned char 1) line 592
    std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() line 59 + 39 bytes
    AT2EXPORTER! 10027884() line 33 + 11 bytes
    Material::`scalar deleting destructor'(unsigned int 0) + 37 bytes
    std::_Destroy(Material * 0x009157d8) line 38 + 34 bytes
    std::allocator<Material>::destroy(Material * 0x009157d8) line 68 + 38 bytes
    std::vector<Material,std::allocator<Material> >::_Destroy(Material * 0x009157d8, Material * 0x00915c38) line 231 + 12 bytes
    std::vector<Material,std::allocator<Material> >::~vector<Material,std::allocator<Material> >() line 59
    $E15() + 34 bytes
    doexit(int 0, int 0, int 1) line 353
    _cexit() line 294 + 11 bytes
    _CRT_INIT(void * 0x10000000, unsigned long 0, void * 0x00000000) line 157
    _DllMainCRTStartup(void * 0x10000000, unsigned long 0, void * 0x00000000) line 252 + 17 bytes
    NTDLL! 77f4b42c()
    NTDLL! 77f50e34()
    KERNEL32! 77e5e6a1()
    ExportPlugin::~ExportPlugin() line 249 + 26 bytes
    ExportPlugin::`scalar deleting destructor'(unsigned int 1) + 37 bytes
    PluginManager::~PluginManager() line 32 + 32 bytes
    $E20() + 34 bytes
    doexit(int 0, int 0, int 0) line 353
    exit(int 0) line 279 + 13 bytes
    WinMainCRTStartup() line 212
    KERNEL32! 77e614c7()
    

    Ich denke ich kann das Problem umgehen indem ich die CRT dynamisch linke.

    Reicht es wenn ich in jedem Projekt einfach nur msvcrt.lib linke und Standarbibliotheken deaktiviere?

    -Thomas



  • Das muss aber gehen wenn jedes Modul wirklich die selbe Standardbibliotheks DLL benutzt. Bist du dir 100% sicher das du überall das gleiche nimmst? Überprüf lieber nochmal gründlich.



  • Ja, ich compile alles auf dem gleichen Rechner zu einer Zeit und Linke auch die gleichen Libraries.

    Für ein PlugIn bin ich jedoch auf ein zusätzliches Set DLLs angewiesen, das natürlich anders kompiliert wurde.

    Hm... Ich hab im Usenet gestöbert, da hatten einige Leute dieses Problem, aber ich finde keine gescheiden Ansätze. Für Hilfe wär ich sehr dankbar 🙂

    -Thomas



  • Ich hab mittlerweile das Problem mal zu Hause reproduziert... Indem man alles auf "Multithreaded DLL" stellt geht es. (Auch wenn es kein Multithreading macht...)

    Mal sehen ob ich das Morgen im Büro auch hinkriege. Wahrscheinlich wird mich der Linker den ganzen Tag erschlagen 😕



  • Das Thema hat sich in 10 Minuten erledigt. -> Alles auf Debug Multithreaded DLL 🙂


Anmelden zum Antworten