www.mikrocontroller.net

Forum: PC-Programmierung verkettete Liste


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich brauche eine verkettete Liste, bei der jeder Knoten eine bestimmte 
Menge Daten enthält. Da ich aber erst zur Laufzeit weiss, welche Anzahl 
an Daten ich benötige, habe ich mir folgendes überlegt:

typedef struct
{
unsigned char *data;
PNODE pNext;
PNODE pPrev;
} NODE, *PNODE;


void Node_Add(int len)
{
PNODE pNode;

pNode = HeapAlloc(hHeap, 0, sizeof(NODE));
pNode->data = (unsigned char*)malloc(len * sizeof(unsigned char));

// Hier Knoten in Liste einfügen
...
}


void Node_Remove(PNODE pNode)
{
...

free(pNode->data);
HeapFree(hHeap, 0, pNode);

...
}


Das Programm läuft. Ich frag mich nur, ob ich mir hier irgendwie ein 
Speicher-Leck programmiert habe?

Gruß Ralf

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
> Das Programm läuft. Ich frag mich nur, ob ich mir hier irgendwie ein
> Speicher-Leck programmiert habe?
>
> Gruß Ralf

Wie kommst du zu der Annahme, btw womit programmierst du denn? 
Visual-C++ hat die Möglichkeit im Debug-gestartene Programme 
hinsichtlich Memory Leaks beim Beenden zu überprüfen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:

> Das Programm läuft. Ich frag mich nur, ob ich mir hier irgendwie ein
> Speicher-Leck programmiert habe?

Das kann man mit diesen Fragmenten nicht sagen.
Speicherlecks enstehen bei linearen Listen meistens
in der Remove Funktion, die einen einzelnen Knoten
auskettet über den Umweg, dass das Freigeben gar
nicht aufgerufen wird.

Aber:
Warum verwendest du einmal HeapAlloc() und einmal malloc()?

Und lass den cast beim Returntyp von malloc weg.
In C ist er unnötig, ja sogar gefährlich, und in
C++ solltest du sowieso kein malloc benutzen
sondern new.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie man sieht, ist mir das mit dem dynamischen Speicher nicht so ganz 
geheuer.

@Simon: Ja, ich nutze Visual-C++. Also bei HeapAlloc reserviere ich mir 
den Speicher für den Zeiger, welcher dann auf die Speicherstellen von 
malloc zeigt. Da war ich mir nicht ganz sicher, ob das so richtig ist. 
Aus deiner Frage schliese ich mal, daß das so stimmt.

@Karl Heinz: Warum HeapAlloc und malloc? Gute Frage. Ich werde das mal 
ändern auf new.

Vielen Dank für eure Antworten.

Gruß Ralf



Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du das Programm im Debug Modus startest, und irgendwann dann 
beendest steht im Debug-Fenster unten ob Memory Leaks aufgetreten sind. 
Zumindest bei mir.

Man kann diese Ausgabe auch noch etwas verfeinern (wenn tatsächlich 
Memory Leaks aufgetaucht sind). Dazu google mal nach "visual leak 
detector".

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:
> @Karl Heinz: Warum HeapAlloc und malloc? Gute Frage. Ich werde das mal
> ändern auf new.

Hmm.
Aus dem Rest deiner Antworten schliesse ich mal, dass du
eigentlich in C++ programmierst. Da erhebt sich natürlich
die Frage: Ist das irgendeine Übungsaufgabe oder ist das
was für den industriellen Einsatz.

Im letzteren Fall: Du weist schon, dass dein C++ Compiler
eine STL mitbringt, in der eine fix fertige Listenklasse
enthalten ist?

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.