FreeLibrary() und C++-Objekte
-
Hi.
Ich hätte mal eine Frage zu der ich nichts gefunden habe...
Angenommen ich habe ein DLL mit LoadLibrary geladen und die DLL enthält C++ Objekte...wenn ich jetzt die DLL mit FreeLibrary entlade, wird dann einfach der Speicher weggerissen oder wird noch der Dekonstruktor der Objekte aufgerufen?Danke.
Grüße,
Flo
-
Nein!
Eine DLL hat so erstmal keinen eigenen Speicher. Allerdings hängt das auch davon ab, wo Du die Objekte erzeugst (Heap,statisch, etc.) und auch von der CRT, die verwendet wird, und weclhen Speicher Du verwendest (Global-, Local, CRT-Heap).
-
Nun ja, ich habe ein statisches, globales Objekt auf das alle Funktionen der DLL Zugriff haben.
Und was meinst du mit eine DLL hat keinen Speicher? Kann sein dass ich die internen Vorgänge in Windows grob missinterpretiere aber wie möchte bitte ein Programm eine Funktion einer dynamisch geladenen DLL ausführen ohne dass Speicher angelegt und der ausführbare Code der DLL in den Speicher gemapt wird ?
-
Ich habe mich zu knapp ausgedrückt.
1. Sicher hat die EXE Speicher. Den für den Code zumindest und den der Ressourcen. Dieser wird geshared zwischen Instanzen und kkomplett freigegeben.
2. Einen Stack hat eine DLL schon mal nicht, so wie eben die Threads des Prozesses einen haben. Der C ode der DLL wird im Kontext der bestehenden Threads ausgeführt. Oder aber neuer. Nur sind die Threads Eigentümer des Stacks und niht die DLL.
3. Statisache Speicher gehört zur DLL und wird entladen wen die DLL entladen wird.
4. Beim Heap wird es kompliziert, denn hier hängt alles davon ab was für ein Speichermodell Du wählst und welche CRT... GlobalAlloc, LocalAlloc, Virtual... Allokationen und so weiter werden in keinem Fall freigegeben wenn die DLL entalden wird.
Bei der CRT ist es abhängig, was für ein Modell Du wählst.Jetzt klarer?
-
@Icematix: probier es doch einfach aus.
Ein kleines OutputDebugString im Destruktor (oder ein Breakpoint), und schon weisst du, ob er aufgerufen wird.Wenn du deine DLL mit MSVC erstellst, und nichts spezielles machst (=keine diesbezüglich wichtigen Default-Einstellungen änderst), dann werden bei FreeLibrary auch Destruktoren aufgerufen.
Wei das andere Compiler machen, weiss ich nicht.Windows selbst sorgt jedenfalls nicht dafür. Windows ruft bloss bestimmte Funktionen beim (vor dem) Entladen einer DLL auf. Wenn der Compiler Code generiert, der sich da reinhängt, dann wird es funktionieren. Wenn der Compiler keinen entsprechenden Code generiert, dann wird es nicht funktionieren.