Forum: PC-Programmierung verkettete Liste


von Ralf (Gast)


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

von Simon K. (simon) Benutzerseite


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.

von Karl H. (kbuchegg)


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.

von Ralf (Gast)


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



von Simon K. (simon) Benutzerseite


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".

von Karl H. (kbuchegg)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.