0

私は、リンクリスト構造でメモリをfree()「ing 」する2つの方法でジャグリングしています。malloc()次のCコードを使用して単一リンクリストを作成するとします。

#include<stdio.h>
#include<stdlib.h>

struct node_type{
  int data;
  struct node_type *next;
  struct node_type *prev;
}
typedef struct node_type node; 
typedef struct node_type *list; 

void main(void){
  list head,node1,tail;
  head=(list)malloc(sizeof(node));
  tail=(list)malloc(sizeof(node));
  node1=(list)malloc(sizeof(node));
  head->next=node1;tail->prev=node1;
  node1->prev=head;node1->next=tail;node1->data=1;

  /*Method-1 for memory de-allocation*/
  free(head->next->next);
  free(head->next);
  free(head);

  /*OR*/

  /*Method-2 for memory de-allocation*/
  free(tail);
  free(node1);
  free(head);

  /*OR*/

  /*Method-3 for memory de-allocation*/
  free(node1);
  free(tail);
  free(head); 
}

今、私は次の質問があります:

Q1)上記のコードに示されているメモリの割り当て解除の3つの方法のうち、正しい/正しくないものはどれですか。

Q2)free()メモリの割り当て解除のために方法1と2で使用されているように、メモリ内の任意の順序に従う必要がありますか、それともランダムにメモリを使用してfree()も問題ありませんか?

4

3 に答える 3

2

示したすべての方法は正しいです。割り当てられたメモリへのポインタが別の割り当てられたメモリにのみ存在する場合にのみ特定の順序に従う必要があり、最初にコンテナを解放すると失われます。

たとえば、割り当ての場合:

int ** ipp;
ipp = malloc(sizeof(int*));
*ipp = malloc(sizeof(int));

正しいfree順序は次のとおりです。

free(*ipp);
free(ipp);

ではなく

free(ipp);
free(*ipp); // *ipp is already invalid
于 2012-05-14T18:56:08.620 に答える
1

これらの方法はすべて正常に機能します。mallocによって割り当てられたメモリブロックを好きな順序で解放できます。

メモリを解放するときに、メモリを割り当てた順序を逆にする必要があることを少し想像してみてください。そうだとすれば、リストの途中からアイテムを挿入したり削除したりすることはできません。動的に割り当てられるデータ構造は、プッシュダウンスタックのみです。

于 2012-05-14T18:55:00.803 に答える
1

リンクリストを解放する簡単な方法は、先頭から始まります。(これは、リストの最後にいる場合、「次へ」がNULLになることを前提としています。)

node * it = head;
while( NULL != it ) {
  node * tmp = it;
  it = it->next;
  free(tmp);
}
于 2012-05-14T18:58:02.270 に答える