メモリを開放するとき、どのタイミングで行えば良いかという話である。
つまり、
int* function() {
int* f;
f = (int*) malloc (sizeof(int)*100);
/*何らかの処理*/
/*ここに開放の処理を書くと、return fで正常に返せない*/
return f;
}
のようなときに関数内で開放しないでどこで開放するの?
という話。
実際それを理解するにはメモリ確保の流れを掴んでおく必要がある。
int* 関数名() {
int* f; …③
f = (int*)malloc(sizeof(int)*100); …④
/*何らかの処理*/
return f;
} …⑤
int main() {
int* x; …①
x = 関数名(); …②⑥
/*開放するタイミング*/ …⑦
return 0;
} …⑧
メモリの流れとしては
①スタックにmainでのローカル変数xの領域が確保される。
②関数が呼び出される
③スタックに関数のローカル変数fの領域が確保される。
④malloc処理により、ローカル変数がヒープに確保された領域のアドレスを知る。
⑤このタイミングでスタックに残っていた関数のローカル変数fの領域が消える。
⑥mainのローカル変数の領域はまだスタックに残っており、ヒープのアドレスを参照できる。
⑦mainのローカル変数が消えて、ヒープのアドレスが分からなくなる前に開放する。もちろん、全ての処理が終わってから開放。
⑧mainのローカル変数がスタックから消える。
という流れを汲んでいる。
したがって、⑦のヒープに残った変数を参照しなくなった時点で開放を行う。
スタック |
ヒープ |
①main変数確保(⑧自動消去) |
④メモリ領域確保(⑦プログラムに記述し、メモリ開放) |
③関数変数確保(⑤自動消去) |
最終更新:2011年04月02日 16:34