0
#include <stdlib.h>

struct strt;
typedef struct {
    int i;
    struct strt *next;
} strt;

strt *s1 = malloc(sizeof(strt));
strt *s2=s1->next = malloc(sizeof(strt));

free(s1);

では、free(s1)s1 が指すブロックのみを解放しますか、それとも s1s1->next/s2 が指すブロックを解放しますか?

これは何千回も尋ねられる質問であることは理解していますが、これを検索エンジンで説明することはできませんでした。また、free()関数のドキュメントで同じ問題について直接言及されているのを見つけることもできませんでした。

4

4 に答える 4

2

メモリリークが発生します。と が指すメモリではなく、 が指すメモリだけs1が解放されs2ますs1->next。だからあなたが必要です

free(s1);
free(s2);

経験則として、freefor everyを使用することをお勧めしますmalloc

于 2012-10-21T11:40:22.177 に答える
2

freeperが必要mallocです。だから、あなたは解放s1し、s2別々にする必要があります。また:

free(s1);
free(s2);

または:

free(s1->next);
free(s1);

s12 番目のケースでは、 ifによって参照されるオブジェクトにアクセスできないため、ステートメントの順序が重要ですs1

C11 (n1570)、§ 7.22.3.3free関数
このfree関数は、 が指すスペースのptr割り当てを解除します。つまり、さらなる割り当てに使用できるようにします。

于 2012-10-21T11:41:51.977 に答える
1

このfree関数は、解放されるメモリ ブロックの背後にある構造を認識していません。への呼び出しはfree、引数として渡されたポインターが指すブロックのみを解放します。あなたの場合、s1->next最初にリリースしてから、s1それ自体をリリースする必要があります。

free(s1->next);
free(s1);
于 2012-10-21T11:40:52.960 に答える
1

メモリ リークがあります。つまり、以前に によって割り当てられたメモリへのポインタが失われ、mallocそのポインタを渡す必要がなくなりましたfree

この性質freeの from 構造体を逆の順序で呼び出す必要があります。mallocs

于 2012-10-21T11:43:10.973 に答える