Tun (statisch gelinkt) DLLs verwenden Sie einen anderen Haufen als das Hauptprogramm?

Ich bin neu in der Windows-Programmierung, und ich habe gerade "lost" zwei Stunden Jagd ein bug den jeder scheint sich bewusst: Sie können nicht erstellen Sie ein Objekt auf dem heap in einer DLL und zerstören es in einer anderen DLL (oder das Hauptprogramm).

Ich bin mir fast sicher, dass unter Linux/Unix ist dies NICHT der Fall ist (wenn es ist, bitte sagt es, aber ich bin mir ziemlich sicher, ich hab das Tausende Male ohne Probleme...).

In diesem Punkt habe ich ein paar Fragen:

1) statisch gelinkten DLLs verwenden Sie einen anderen Haufen als das Hauptprogramm?

2) Ist die statisch gelinkte DLL abgebildet in dem gleichen Prozess Raum des main-Programm? (Ich bin ganz sicher, hier ist die Antwort ein großes JA sonst würde es keinen Sinn machen übergabe von Zeigern von einer Funktion im Hauptprogramm an eine Funktion in einer DLL).

Ich spreche plain/reguläre DLL, nicht, COM/ATL-services

EDIT: Von "statisch" meine ich, dass ich nicht mit LoadLibrary die DLL laden, aber ich verknüpfen mit stub-Bibliothek

  • Es hängt von den Einstellungen für jedes Modul. In der Regel, wenn zwei Module verwenden Sie die dynamische CRT, dann teilen Sie den heap, da Sie beide haben die gleiche Instanz des CRT geladen. Wenn ein Modul verwendet die statische CRT-dann hat es seinen eigenen Haufen, da hat er seine eigene Instanz des CRT statisch eingebunden.
  • Darüber hinaus ist es möglich, für verschiedene Module, um verschiedene Versionen der dynamische (DLL) CRT, und daher verschiedene Haufen.
  • So ziemlich jede nicht-triviale DLL erstellen müssen, die Ihren eigenen Haufen, wenn man darüber nachdenkt. Nehmen Sie die OpenAL-Bibliothek als ein Beispiel. Sie können die feed-Daten in ein Puffer-Objekt (lib macht seine eigene Kopie der Daten), einige Parameter einstellen, und die Bibliothek wird sound Abspielen-toll, einfach, perfekte, keine sorgen. Jetzt stellen Sie sich die zwei Programme laden Sie die Bibliothek. Wohin mit den Daten, wem gehört es? In welchem Teil des physischen RAM ist es? Will ich "ein anderes Programm" sehen zu können (oder zu ändern) die Daten auf meinem Programm-heap? Wenn es Leben auf deinem main-Modul heap, den man irgendwie in Schwierigkeiten...
  • Er hat zwei verschiedene Haufen, bedeutet nicht, haben 2 verschiedene virtuelle Adressräume... ich denke, dass der zweite Haufen (der DLL) ist noch abgebildet in der Haupt-Prozess-Adressbereich. In deinem Beispiel denke ich, dass die OpenAL verwendet immer noch Ihre Haupt-Speicher verarbeiten, so sollte es keine zufälligen teilen. Ansonsten gibt es etwas, was ich bin wirklich über fehlende DLLs hier 🙂
InformationsquelleAutor Emiliano | 2012-05-30
Schreibe einen Kommentar