Frage

Betrachten Sie diesen Fall:

dll = LoadDLL()
dll->do()

...
void do() {
    char *a = malloc(1024);
}
...

UnloadDLL(dll);

Stehen die im Aufruf von malloc() zugewiesenen 1 KB zu diesem Zeitpunkt wieder für den Hostprozess zur Verfügung?Die DLL ist statisch mit der CRT verknüpft.

War es hilfreich?

Lösung

Nein, Sie nicht auslaufen.

Wenn dll Modelle (statisch, dynamisch) mischen, dann kann man mit einem Speicherfehler am Ende, wenn Sie in einer DLL-Speicher zuzuordnen, dass Sie frei in einem anderen (oder in der EXE befreit)

Das bedeutet, dass der Haufen durch das statisch gelinkte CRT erstellt ist nicht der gleiche Haufen als ein andere DLL CRT.

Wenn Sie mit der dynamischen Version der CRT verknüpft haben, dann würden Sie ein Leck haben, wie der Heap unter allen dynamisch gebundenen CRTs geteilt wird. Es heißt, Sie sollten immer Ihre Anwendungen entwerfen, um die dynamischen CRTs verwenden, oder stellen Ihnen sicher nie Speicher über eine DLL-Grenze verwalten (dh, wenn Sie Speicher in einem DLL zuweisen, bieten immer eine Routine in der gleichen DLL zu befreien)

Andere Tipps

  1. Der vom Betriebssystem verfolgte Speicherverbrauch eines Prozesses gilt für den gesamten Prozess und ist nicht spezifisch für eine DLL.

  2. Der Speicher wird dem Programm vom Betriebssystem in Blöcken, sogenannten Heaps, zur Verfügung gestellt

  3. Die Heap-Manager (malloc/new usw.) teilen die Blöcke weiter auf und verteilen sie an den anfordernden Code.

  4. Erst wenn ein neuer Heap zugewiesen wird, erkennt das Betriebssystem eine Speichervergrößerung.

  5. Wenn eine DLL statisch mit der C-Laufzeitbibliothek (CRT) verknüpft ist, wird eine private Kopie der CRT mit den CRT-Funktionen, die der DLL-Code aufruft, kompiliert und in die Binärdatei der DLL eingefügt.Darin ist auch Malloc enthalten.

  6. Diese private Kopie von malloc wird immer dann aufgerufen, wenn der in der statisch verknüpften DLL vorhandene Code versucht, Speicher zuzuweisen.

  7. Folglich erhält dieser Malloc vom Betriebssystem einen privaten Heap, der nur für diese Kopie von malloc sichtbar ist, und weist den vom Code angeforderten Speicher innerhalb dieses privaten Heaps zu.

  8. Wenn die DLL entladen wird, entlädt sie auch ihren privaten Heap. Dieses Leck bleibt unbemerkt, da der gesamte Heap an das Betriebssystem zurückgegeben wird.

  9. Wenn die DLL jedoch dynamisch verknüpft ist, wird der Speicher von einer einzigen gemeinsam genutzten Version von malloc zugewiesen, global für den gesamten Code, der im gemeinsam genutzten Modus verknüpft ist.

  10. Der von diesem globalen Malloc zugewiesene Speicher stammt aus einem Heap, der auch für den gesamten anderen Code verwendet wird, der im dynamischen, also gemeinsam genutzten Modus verknüpft ist und daher gemeinsam ist.Jedes Leck aus diesem Heap wird daher zu einem Leck, das den gesamten Prozess beeinträchtigt.

Bearbeiten – Beschreibungen des Verknüpfungsszenarios hinzugefügt.

Sie können nicht sagen. Dies hängt von der Umsetzung Ihres statischen und dynamischen CRT. Es kann sogar hängen von der Größe der Zuteilung, da es CRTs, die nach vorne große Zuweisungen an das OS, sondern ihre eigenen Haufen für kleine Zuweisungen implementieren.

Das Problem mit einem CRT, das ist natürlich Lecks, die sie undicht ist. Das Problem mit einem CRT, das nicht der Fall entweicht, dass die ausführbare Datei könnte vernünftig erwarten, dass der Speicher verwenden, da malloc'ed Speicher sollte nutzbar bleiben, bis sie frei aufgerufen wird.

Von MSDN Mögliche Fehler Passing CRT Objekte über DLL-Grenzen

  

Jede Kopie der CRT-Bibliothek hat eine   separater und unterschiedlicher Zustand. So wie,   CRT-Objekte wie Datei-Handles,   Umgebungsvariablen und Gegenden sind   nur gültig für die Kopie der CRT   wo diese Objekte zugewiesen oder   einstellen. Wenn eine DLL und seine Benutzer verwenden   verschiedene Kopien der CRT-Bibliothek,   Sie können diese CRT Objekte passieren   über die DLL-Grenze und erwarten   sie richtig abgeholt werden auf der   andere Seite.

     

Auch, weil jede Kopie der CRT   Bibliothek verfügt über einen eigenen Heap-Manager,   Speicher in einer CRT-Bibliothek Zuteilen   und Leiten des Zeigers über eine DLL   Grenze von einem anderen befreit   Kopie der CRT-Bibliothek ist ein potenzielles   verursachen für Heapbeschädigung.

Hope, das hilft.

Eigentlich ist die deutliche Antwort falsch. Dieses Recht gibt es ein Leck. Obwohl es technisch möglich ist, für jede dll seiner eigenen Haufen, zu implementieren und es beim Herunterfahren frei, die meisten „Laufzeit“ Haufen - statisch oder dynamisch - sind Wrapper um den Win32-Prozess Heap API

.

Es sei denn, eine bestimmte Sorgfalt verwendet hat, um sicherzustellen, dass dies nicht der Fall ist, wird die dll die Zuteilung pro Ladung auslaufen, zu tun, Zyklus entladen.

Man könnte einen Test und sehen, ob es Speicherlecks sind. Sie führen einen einfachen Test 30mal Zuteilung 1 MB jedes Mal. Sie sollten das ganz schnell herausfinden.

Eine Sache ist sicher. Wenn Sie Speicher in der DLL zugewiesen Sie sollten auch frei, dass der Speicher dort (in der DLL).

Zum Beispiel sollten Sie so etwas wie dieser (einfacher, aber intuitiver Pseudo-Code) haben:

dll = DllLoad();

ptr = dll->alloc();

dll->free(ptr);

DllUnload(dll);

Dies muss geschehen, weil die DLL einen anderen Haufen als der ursprüngliche Prozess hat (das lädt die dll).

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