mikrocontroller.net

Forum: PC-Programmierung Speicher reservieren und freigeben in DLLs


Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe hier in meinem Projekt 2 DLLs, bei deren Verwendung das 
Programm leider reproduzierbar abstürzt. Und zwar innerhalb der einen 
DLL. An der Stelle des Absturzes soll mittels free Speicher freigegeben 
werden. Ich habe dann etwas nachgeforscht, wo der Speicher reserviert 
wurde. Mir ist dann aufgefallen, dass dies innerhalb einer Funktion der 
anderen DLL geschieht.

Könnte das die Ursache des Problems sein? Muss Speicher immer von dem 
Modul freigegeben werden, wo er reserviert wurde? Oder wovon hängt das 
ab, wann das der Fall sein muss und wann nicht?

Viele Grüße,
Klaus

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte eigentlich kein Problem sein.
Der mit free() freigegebene Speicher muß im selben
Prozeß allokiert worden sein; in welcher DLL oder im
Hauptprogramm ist egal.

Vielleicht wird er versehentlich zweimal freigegeben?

Viele Grüße,
Klaus

Autor: Thomas K. (muetze1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hängt ganz davon ab, ob es der gleiche Speichermanager ist. Gäbe es nur 
einen, dann bräuchten die ganzen WinAPI Aufrufe (z.B. kernel32.dll) 
keine Buffer und Buffergrößenangaben. Die WinAPI umgeht dies Problem 
grundlegend so, dass sie die Buffer immer vom Aufufer gestellt haben 
will (Ausnahme IMalloc Interface in der Shell).

Es gibt keinen Standard oder Interface für den Abgleich der 
Speichermanager. Und da DLL schlecht vorschreiben können wer sie lädt, 
bringen sie im Normalfall einen Speichermanager mit. Visual Studio 
Projekte referenzieren immer die runtime Library DLL und somit benutzen 
sie indirekt den gleichen Speichermanager, da er in dieser DLL enthalten 
ist.

Aber so oder so ist die Grundsatzregel: Speicher immer dort freigeben wo 
er alloziiert wird. Das bedeutet nicht nur das gleiche Modul sondern im 
Normalfall auch die gleiche Ebene. Finally Anweisungskonstrukte wurde ja 
in vielen C++ Anbietern als eigene Spracherweiterung nachgereicht.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird der Speicher mit den CRT-Funktionen (m)alloc und free verwaltet, 
oder vielleicht doch mit den Win32-API-Funktion GlobalAlloc und 
GlobalFree? Die darf man keinesfalls vertauschen.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke euch! Es liegt also daran, dass die beiden DLLs jeweils ihren 
eigenen Heap verwalten, da beide statisch gegen die CRT gelinkt sind. 
Und somit jede ihre eigenen Kopie des Speichermanager hat.

Ich werd die Entwickler der DLLs mal ne kleine verbale Watsche (aka 
Bugreport) verpassen :)

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob statisch oder dynamisch gelinkt spielt keine Rolle. Bei M$ haben die 
DLLs in beiden Fällen ihren eigenen Heap.

CU

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... schrieb:
> Ob statisch oder dynamisch gelinkt spielt keine Rolle. Bei M$ haben die
> DLLs in beiden Fällen ihren eigenen Heap.

Oh, wirklich? Das würde meine Theorie durcheinander bringen. Wenn die 
CRT dynamisch (von beiden DLLs die selbe Version) gelinkt wird, dann 
müsste doch für den Prozess, der die DLLs läd nur eine Kopie der 
Heapverwaltung vorhanden sein, oder?  Dafür spricht auch, dass es nicht 
zu einem Absturz kommt, wenn die CRT in beiden DLLs dynamisch eingelinkt 
ist.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob bestimmte Code-Segmente mehrfach im Speicher liegen ist völlig egal. 
Interressant ist auf welche Daten-Segmente sie zugreifen.
Auch ein Program, daß überhaupt keine DLLs benutzt, kann mehrere Heaps 
haben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.