0

次のような単純なリンク リスト ノードがあります。

typedef struct node {
    void *data;
    struct ListElement *next;           
} node;

また、次のようにノードの作成および削除機能があります。

void createNode(void *data){
    node *n = malloc(sizeof(node));
    //assign data to data and initialize pointer to NULL
}

void deleteNode(List *list, Node *node){
    //Take care of the next pointer
    free(node);
}

ノードを解放するとき、構造体のメンバー (データと次のポインター) も削除する必要がありますか? 私は特にメンバーにmallocを使用しているのではなく、構造体全体にのみ使用していますか? もしそうなら、どうすればいいですか?ノードのすべてのメンバーがヒープに配置され、スタックはまったく使用されませんか?

4

3 に答える 3

1

dataは変数ではなく、 のメンバーですstruct nodestruct nodeを呼び出して動的に割り当てるとmalloc()、構造体のすべてのメンバーを保持するのに十分な大きさのメモリのチャンクが得られます。これには明らかにポインターのストレージが含まれますが、ポインターが指す内容dataのストレージは含まれません。したがって、構造体メンバーのストレージを個別に解放する必要はありません。構造体にとっては十分です。free

ただし、dataそれ自体がポインタであるため、それが指すメモリの場所と、このメモリがどのように初期化されるかを確認するまで、このメモリを解放する必要があるかどうかはわかりません。

于 2013-04-27T18:11:14.390 に答える
1

free通常、dataメンバーも必要であり、 freeingnodeの前にそれを行う必要があります。

free(node->data);
free(node);

free node->nextただし、リストの残りを保持するか、リスト全体を保持する必要があるため、その必要はありませんfree。次の解放はループの次の繰り返しで行われます。

割り当てられた (withなどの) メモリnode->dataを指していない場合は解放してはいけませんが、これはまれな状況です。malloc

于 2013-04-27T17:59:17.763 に答える