Wie erfolgt die Zerstörung der Reihenfolge der statischen Objekte in verschiedenen DLLs zu zwingen?

StackOverflow https://stackoverflow.com/questions/872143

  •  22-08-2019
  •  | 
  •  

Frage

Ich habe 2 statisch Objekte in 2 verschiedenen DLLs :

Ein Objekt Ressourcen (das ist ein Singleton), und ein Objekt Benutzer . Objekt Benutzer in seinem destructor hat auf Objekt-Ressourcen zugreifen zu können.

Wie kann ich Objekt Ressourcen zwingen nicht vor Objekt Benutzer zerstört werden?

War es hilfreich?

Lösung

Globale Objekte werden zerstört, wenn ihre entsprechenden DLL entladen wird. So wie Ihre ‚User‘ dll ist wahrscheinlich abhängig von Ihrer ‚Resource‘ dll, sind Sie in Schwierigkeiten: ‚Ressource‘ wird immer vor dem ‚Benutzer‘ zerstört werden

.

Ich bin auch durch eine gute Antwort auf diese Frage interessiert, wenn man existiert. Bis jetzt, ich bin mit einer Bereinigungsfunktion, die durch Anwendung aufgerufen werden muss, bevor es beendet wird, und ich halte nur harmlos Code in Destruktoren.

Andere Tipps

Wenn Sie in der Lage sind, dass zwei globale Variablen in der gleichen DLL zu setzen, es ist nicht die gleiche Geschichte. Wie in ihrer eigenen Antwort von Jem gesagt, wird DLL detachement, um durch das System nicht garantiert. Daher können Sie ein großes Problem, wenn mit 2 Dlls getrennt. Ich bin kein Windows-System-Guru, aber einen Blick mit Google, fand ich Msdn Blogger, die sie ohne gute Lösung zu adressieren es hatte das gleiche Problem erzählt.

ich Sie sind in der Lage, sie in einem gleichen DLL zu setzen, mich nach der Lösung ist einfacher, in diesem Fall müssen Sie nicht die „nicht garantiert DLL detachement Ordnung“ -Ausgabe (unlösbare soweit ich verstehe) zu adressieren .
Aber dann müssen Sie noch ein neues Problem zu beheben: globale Variable Zerstörung, um nicht durch die Sprache C ++ Garantierter. Aber das kann man angesprochen werden:

Sie brauchen eine Art von Referenz couting zu verwenden. ein boost :: shared_ptr kann den Trick tun.

es global erklären und definieren, dass es so:

boost::shared_ptr my_resource_ptr ( new Resource() ); // new operator is important here!

Dann müssen Sie Ihre Benutzer-Implementierung auf speichern seine eigene Shared_ptr ändern:

class User
{
    ...
    boost::share_ptr a_resource_ptr;
    ...
};

Solange alle eine Ihrer Benutzerinstanz nicht zerstört wird, so würden diese ‚behalten‘ die Ressource-Instanz und so verhindern, dass es vor dem prematuraly gelöscht, auch wenn die globale Shared_ptr zerstört worden sein könnte.
Die letzte Benutzer Instanz zerstört wird (undirectly), um die Ressource-Instanz löschen.

Was auch immer die Referenzzählung Sie verwenden, ComPtr, ihre selbst, sollte es den Trick.

Ich glaube nicht, dass Sie, um die Zerstörung von Globals ändern können, die in verschiedenen Modulen sind. Jede Chance, das Hinzufügen einiger Referenzzählung?

Im Fall, dass Sie wirklich 2 getrennt Dlls bekommen kann ich ein paar Hinweise für Sie: Sie können die Verwendung von FreeLibrary() von Windows API betrachten. Wie bereits erwähnt von Msdn FreeLibrary() dekrementiert einen Referenzzähler für die DLL, die entladen werden, wenn der Zähler 0 erreicht.

Nachteil: mit FreeLibrary() impliziert Sie laden es mit LoadLibrary() ( MDSN DllMain Link .

So wird es die „Ressource“ Bibliothek entladen nur einmal die „User“ Bibliothek Finish mit ihm.

haben einen Versuch, wenn Sie und lassen Sie mich sagen, ob es funktioniert, wie ich es nie umgesetzt ..

Ps: Ich habe posta zweite Antwort auf Ihre Frage eine sinnvolle Trennung zwischen den beiden Antworten zu bekommen, wie ich (versuchen) Detail beide. Ich möchte nicht, dass Sie sie mischen und verwirrt ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top