2012-03-20 14 views
0

* 強いテキスト Cは、以下の機能の助けを借りて、経度と呼ばれるに私がリンクリストを作成*:私は番号のリストを作成するアイコンのリストをインクリメントその後、 Cで単純なリンクリストのメモリを解放する2つの方法は?

struct ilist_node { 
    struct ilist_node * rest; 
    int first; 
}; 

typedef struct ilist_node *ilist; 


ilist icons(int in, ilist il) { 
    ilist r = malloc(sizeof(struct ilist_node)); 
    r->first = in; 
    r->rest = il; 
} 

その後、リスト内の各要素を印刷し、リストに使用されているメモリを解放しようとしました。

while (lon!= NULL) { 
     ilist tmp = lon->rest; 
     printf(" %d\n",lon->first); 
     free(lon); 
     lon = tmp; 
    } 

わかりますこの機能は上で動作します。 (私はメモリを解放する方法を探せ、これは一般的な答えと思われる)。しかし、好奇心のうちに私は別のものを試しました:

ilist tmp = lon; 
    while (lon != NUll) { 
     printf(" %d\n",lon->first); 
     lon = lon->rest; 
    } 

    idelete(tmp); 

そしてそれも動作します。だから少し混乱している。最後のものが動作する場合、なぜリストを通過してすべてのノードを解放する必要がありますか?

+0

リストをループしてコメントを付けるのか、そのスペースを解放するのかは明確ではありません。私はideleteが本当に私たちが比較する必要があると仮定した場合、ideleteのソースも投稿してください – gbulmer

+0

ああ、ありがとう。うん、それは私の理想的な私の教授によって与えられたideleteを使用しているので、組み込みの削除の代わりに。愚かな間違い – x7qiu

+0

よくあることですが、質問すると助けになります! - ) – gbulmer

答えて

2

ideleteのソースコードが表示されるまではコメントできません。 PITAである可能性があるので、誰も正確にコメントできないと思います。

ideleteのソースが必要です。

ideleteは正常に動作します

void idelete(ilist il) { 
    while (il!= NULL) { 
     ilist tmp = il->rest; 
     free(il); 
     il = tmp; 
    } 
} 

かもしれません。

0

idelete()は、最初の例で使用するセマンティクス(リスト要素の繰り返し処理中にfree()を実行する)を実装する必要があります。すべてを解放する必要があります。したがって、ideleteilistタイプについて知っていて、freeをリスト要素(リストエントリを渡す)の内部で呼び出すことができれば、あなたは問題なく、リークは発生しません。

しかし、それは当てはまらない場合は、私の下に元の文(および他の回答)が適用されます。


秒1は、文字通り最後の/最初の要素が解放されます(あなたが順序を考慮してどのように応じて、リンクされたリストの要素の) - あなたが割り当てたものはilist tmp = lonです。それは動作しますが、いくらかメモリがリークします。

これがLinuxまたはそれをサポートするUnixoidシステム上にある場合は、デフォルトツールmemcheckでValgrindが何を言っているかをチェックすることを強くお勧めします。

関連する問題