2016-04-02 14 views
2

以下は、aを作成する単純なプログラムで、リンクされたリストを解放します。しかし、私はfree_list関数が割り当てられたすべてのメモリが解放されることを保証するかどうかは不明です。リンクリストが解放されていることを確認する

int main(int argc, char *argv[]) 
{ 
    struct node *head = build_list(); 
    free_list(head); 

    return 0; 
} 

build_list()単純な三の員リスト作成:ここ

は、単に他の二つの機能を呼び出す主な機能は、である)

struct node *build_list() 
{ 
    struct node *head = malloc(sizeof(struct node)); 
    struct node *two = malloc(sizeof(struct node)); 
    struct node *three = malloc(sizeof(struct node)); 

    head->data = 0; 
    head->next = two; 

    two->data = 1; 
    two->next = three; 

    three->data = 2; 
    three->next = NULL; 

    return head; 
} 

とfree_listを(解放しようとしシーケンス内のリストの各メンバー:

void free_list(struct node *curr) 
{ 
    struct node *tmp; 

    while (curr) { 
     tmp = curr; 
     curr = tmp->next; 
     free(tmp); 
    } 
} 

私の質問は、かどうか、この自由ですすべての割り当てられたメモリ。それは必要なように見えますが、use * tmpによってメモリブロックが割り当てられたままになるかどうかはわかりません。最後に、リンクされたリストを解放するためのベストプラクティスについてのアドバイスは、非常に高く評価されます。

ありがとうございました!

struct node { 
    int data; 
    struct node *next; 
}; 

答えて

2

私が使用*のtmpがメモリのブロックが割り当てられたままする可能性がありますかどうかわからない午前:

は参考のため、ここでのノード構造体です。

いいえ、できません。 Cには、free()の呼び出しによって明示的に解放された後、動的に割り当てられたメモリが周りに残るような構造体はありません。

関数の最後にtmpは実際に最後のノードの位置を指します。しかし、この時点ではダンクリングポインタであるため、害はありません。

リンクされたリストを解放するためのベストプラクティスについてのアドバイスをいただければ幸いです。

好きなリストを解放するための古典的なプログラムです。もしあれば、リストを解放するために好ましい

while (curr) { 
    struct node * tmp = curr; 
    curr = tmp->next; 
    free(tmp); 
} 
+0

方法であって、それはループの外で使用されていないので、 ここで考慮すべき唯一の変更は、ループの体内にtmpそれを宣言していますか?また、tmpはNULLに設定して、ぶら下がっているポインタでないか、不要なポインタにする必要がありますか? –

+1

@wm単独リンクされたリストの場合、あなたがコード化した1つの妥当な解放方法があります。再帰的なものをコード化することもできますが、それは再帰の乱用になります。 – dasblinkenlight

関連する問題