2016-07-09 53 views
1

Wenn ich so etwas wie:Soll ich einen temporären Zeiger freigeben, um eine verkettete Liste zu durchlaufen?

function(DLL *dll) { 
    DLL_Node *temp = dll->head 

    // do stuff with temp like traverse list with temp=temp->next 

    // say when done, temp = dll->tail, should I free(temp) or leave it alone? 
} 

Ich bin mit Zeigern noch nicht sehr erfahren, scheint es, wie ich einen zusätzlichen Zeiger erstellt, aber es weist nur auf eine Position in der Liste, so dass ich nicht soll frei es und es wird gelöscht, wenn die Funktion endet?

By the way I definiert DLL und DLL_Node wie folgt aus:

typedef struct dll_node { 
    int data; 
    struct dll_node *prev; 
    struct dll_node *next; 
} DLL_Node; 

typedef struct DLL_ { 
    int count; 
    DLL_Node *head; 
    DLL_Node *tail; 
} DLL; 

ich eine Empfehlung für das Programm valgrind zur Prüfung auf Speicherlecks sah und es sagt, auf jeden Fall verloren und verloren indirekt sind beide 0 Bytes, aber möglicherweise verloren ist 2.064 Bytes. Nicht sicher, was das genau bedeutet oder ob es relevant ist.

Antwort

5

Der Aufruf free gibt keinen Zeiger frei, es gibt den Zeiger frei. Das einfache Deklarieren und Verwenden eines Zeigers erfordert kein Freigeben, sodass Sie keinen Zeiger freigeben müssen, der zum Durchlaufen einer Liste verwendet wurde.

Die Regel ist, dass Sie free auf alles anrufen müssen, die von malloc/calloc/realloc an Sie zurückgeschickt wurde. Auf jedem zugewiesenen Block muss nur ein Aufruf von free erfolgen. Wenn Sie denselben Block zweimal freigeben, erhalten Sie undefiniertes Verhalten.

+0

Danke, dass ich dachte, aber ich war mir nicht ganz sicher. Irgendeine Idee, wenn die möglicherweise verlorenen Bytes, die von Valgrind gezeigt werden, sich sorgen müssen? – Austin

+1

@Jake Möglicherweise verloren bedeutet, dass Ihr Programm nicht mehr einen Zeiger auf einige der zugewiesenen Blöcke enthält, aber es gibt Zeiger in der Mitte davon. Wenn Sie einige Zeigerarithmetik mit den Blöcken verwenden, die Sie zuweisen, würde Valgrind "möglicherweise verlorene" Warnungen erzeugen. – dasblinkenlight

1

Um nur hinzuzufügen, was @dasblinkenlight gesagt hat, müssen Sie es nicht explizit löschen/entfernen. Da sich * temp im Funktionsumfang der Funktion befindet, ist sie nach der Rückkehr der Funktion verschwunden.

Da Sie sich Gedanken über den ungenutzten Speicher machen, benötigt ein Erinnerungszeiger 4 Bytes auf einer 32-Bit-Maschine und 8 Bytes auf einer 64-Bit-Maschine und nicht die Größe von (DLL_Node), wie Sie vielleicht denken.