関数に次のものがある場合:
struct example *A=malloc(sizeof(struct example));
A が指す場所に作成されたノード/メモリ空間は、関数の終了/終了後に破棄されますか? それともヒープに残りますか?
関数に次のものがある場合:
struct example *A=malloc(sizeof(struct example));
A が指す場所に作成されたノード/メモリ空間は、関数の終了/終了後に破棄されますか? それともヒープに残りますか?
いいえ。によって割り当てられたメモリは、 'dmalloc
まで割り当てられたままになります。free
このようなことをする:
char * function(void)
{
char c = 'a';
return &c;
}
一方、このオブジェクトは関数の終了時にスコープ外になるため、問題があります。
malloc
ヒープにメモリを割り当てます。変数を宣言すると、スタックにスペースが割り当てられます。スタックはスコープの影響を受けますが、ヒープは影響を受けません。
malloc
メモリリーク(永久に存続するようにメモリへの参照を失うプロセス)などのさまざまな落とし穴を含む、ポインタの使用に関する追加情報については、このリンクにアクセスしてください。
あなたはあなたがするfree
すべてのものを持っていますmalloc
。関数が戻ると、変数A
はスコープ外になりますが、メモリは割り当てられたままになります。(他の場所に保存されていない限り)メモリへのポインタを失ったため、メモリリークが発生しています。
が指すメモリがまだ必要な場合はA
、割り当てられた構造体へのポインタを返し、後で解放することができます。関数が戻った後で割り当てられたメモリが必要ない場合は、。を使用してメモリを解放しますfree(A)
。