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
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.
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.
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
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".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.