wieder mal: Dll und new/delete



  • Hallo!

    Ich weiß, ist ein altes Thema was shcon oft besprochen wurde, allerdings habe ich noch keine ordentliche Lösung für mien Problem gefunden:

    Ich habe ein Hauptprogramm Main.exe was verschiedene DLLs als Plugins lädt. einige dieser Plugins besitzen funktionen, die mit new objekte vom typ Obj erstellen und Obj* zurückgeben. Diese werden dann im Hauptprogramm verarbeitet und auch von anderen Plugins.
    Hätte ich nur eine Dll, könnte ich in dieser Dll eine funktion freeObj implementiern und die sache wär gegessen.
    Das Problem ist aber, dass ich zur Zeit des verarbeitens nicht mehr weiß, welche Dll jetzt ein Obj erstellt hat. Ich habe einen std::vector<Obj*> wo viele obj* drin sind, alle von verschiedenen Dlls geladen. es kann sogar sein, dass das Hauptprogramm ein Obj* erstellt hat. wenn ich jetzt mittels einfachem delete den vector durchlaufe gibts natürlich zugriffsverletzungen, weil ich ja in der exe nicht den speicher von der dll freigeben kann.
    Gibt es eine einfache Lösung für dieses Problem? Ich fände es zum Beispiel sinnvoll in den Dlls den operator new zu überschreiben und ihn sozusagen auf den operator new in der main.exe zu biegen. ginge das? mit delete wäre das dann das gleiche. Dann würde also der gesamte dynamische speicher in der exe allokiert werden und auch wieder freigebebn. Wenn das ginge, könntet ihr dann ein kleines Beiospiel posten? New überladen kenn ich nämlich gar ncih 🙂
    Oder biete die WinAPI durch LocalAlloc, GlobalAlloc oder Konsorten etwas an? mit den funkitonen kenn ich mich nämlich auch nicht aus 🙂

    Hoff, ihr könnt helfen,
    Maxi


  • Mod

    Dann implementiere in die Objekte eine virtuelle Funktion Destroy die dann ein delete this; druchführt und schon wird der Code dort ausgeführt wo er auch hingehört.



  • sicher?
    Wenn ich in der dll new Obj aufrufe, und dann in Main.exe obj::free wird dann nich delete trotzdem aus der exe aufgerufen?


  • Mod

    Nein! In diesem Fall hast Du recht. Dann wird new in der EXE ausgeführt!

    Bau eine statische CreateInstance Funktion und eine entsprechende virtuelle DestroyInstance Funktion. Dann werden alle Allokationen dort durchgeführt, wo die Klasse lebt.

    Ich nutze für solche Fälle immer nur Interfaceklassen, die durch eine entsprechende Factory Funktion in der DLL erzeugt und returniert werden. Die entsprechende Klasse hat auch eine Funktion die das Objekt entsorgt. Mehr braucht man nicht um das ganze korrekt im OOP zu kapseln.


Anmelden zum Antworten