[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 <- ScreenshotEr 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