Frage

Ich arbeite an einem Projekt, das eine Klasse 'A' hat, die eine statische STL -Containerklasse enthält. Diese Klasse ist sowohl in meinem Hauptprogramm als auch in einer .so -Datei enthalten. Die Klasse verwendet den standardmäßigen (impliziten, nicht deklarierten) Konstruktor/Destruktor. Das Hauptprogramm lädt die .so -Datei mit DLOPEN () und in seinem Destruktor auf, nennt dlclose (). Das Programm stürzt nach dem Hauptverlauf ab, wenn Glibc den Destruktor für die statische Klassenmitgliedvariable nennt. Das Problem scheint zu sein, dass, wenn dlclose () aufgerufen wird, der Destruktor für die statische Variable aufgerufen wird, dann nennt Main exits () glibc auch den Destruktor, was zu einem doppelten freien freien Bereich führt.

Ich habe 2 Fragen, nämlich:
1) In diesem speziellen Fall, warum gibt es nicht zwei Kopien der statischen Variablen (ja, ich weiß, das klingt etwas lächerlich, aber da sowohl das Hauptprogramm als auch die .so -Datei eine separat kompilierte "a" haben, sollten sie nicht jeweils haben, sollten sie jeweils je eines?)
2) Gibt es eine Möglichkeit, dieses Problem zu lösen, ohne die Klasse 'a' neu zu schreiben, um keine statischen Mitgliedsvariablen zu enthalten?

War es hilfreich?

Lösung

Diese Frage wurde in einer anderen Frage gelöst, die ich veröffentlicht habe. Grundsätzlich gab es tatsächlich zwei Kopien der statischen Variablen - eines im Hauptprogramm und eines in der gemeinsamen Bibliothek, aber der Laufzeit -Linker löste beide Kopien in die Hauptprogramme -Kopien auf. Weitere Informationen finden Sie in dieser Frage:

Hauptprogramm und gemeinsame Bibliothek initialisiert die gleiche statische Variable in __static_initialization_and_destruction_0

Andere Tipps

Ich glaube, dass STL -Klassen immer dynamisch erstellt werden, sodass Sie sie nicht als statisch bezeichnen können. Sie existieren auf dem Haufen. Wenn das Mitglied an eine Funktion übergeben wird, wird eine Kopie in den statischen Speicher gebracht. Sie müssen Ihren eigenen Zerstörer machen, der die STL explizit einmal löscht.

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