2016-07-09 1 views
1

:私はまだ非常にポインタを経験していないよリンクリストをトラバースするための一時ポインタを解放する必要がありますか?私のようなものがある場合

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? 
} 

を、私は余分なポインタを作成したように、それはそうですが、それは単に、リスト内の位置を指すので、私はいけませんそれを解放し、機能が終了するとクリアされますか?私はこのようなDLLDLL_Nodeを定義しところで

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; 

私はメモリリークのテストのためのプログラムvalgrindのための勧告を見て、それは間違いなく可能性が失われ、間接的に失われ、両方の0バイトが、しかし言います失われた2,064バイトです。正確に意味するものか、それが適切かどうかは不明です。

答えて

5

freeを呼び出すと、ポインタが解放されず、ポインタが指しているものがあれば自由になります。単に宣言してポインタを使用しても解放されるわけではないので、リストをトラバースするために使用されたポインタを解放する必要はありません。

malloc/calloc/reallocで返されたすべてのものにfreeと電話する必要があります。割り当てられた各ブロックには、freeのコールが1つだけ必要です。同じブロックを2回解放すると、の結果はになります。

+0

私が考えていたことはありがたいことですが、私はあまりよく分かりませんでした。 valgrindによって表示される可能性のあるバイトが気になるものであれば、どうでしょうか? – Austin

+1

@Jakeおそらくは、あなたのプログラムは、割り当てられたブロックのいくつかへのポインタを保持していないが、途中にポインタがあることを意味します。割り当てたブロックにポインタ演算を使用すると、valgrindは "おそらく失われた"警告を生成します。 – dasblinkenlight

1

@dasblinkenlightが言ったことを追加するだけで、明示的に削除/削除する必要はありません。 * tempは関数のスコープの内部にあるので、関数が戻ると消えてしまいます。

あなたは未使用のメモリが気になるので、リマインダーポインターは32ビットマシンでは4バイト、64ビットマシンでは8バイト、考えているのはsizeof(DLL_Node)ではありません。

関連する問題