mallocの
C言語のライブラリ関数だ。
なんでこんなのがいるかというと「実行するまでどのくらいのメモリを使うかわからない」という場合に使う。
メモリ領域ではヒープ領域というところに作られる。
この例では、free関数を使って解放していない。
しかし、main関数を抜けるとこのアプリケーション自体が無くなるので自動的にOSが解放してくれる。(OSは大抵解放できる能力をもってえいる。必ずではない)
以下のコードは何度もmallocして4バイトの連続したメモリ領域をヒープ領域に作る。
printfでmallocで確保した領域の先頭アドレスとp変数のアドレスを表示している。
C:\usr\lesson\opencv\C_C++の練習\malloc>type main.cpp
<stdio.h>
<stdlib.h>
int main(void){
void *p;
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
return 0;
}
C:\usr\lesson\opencv\C_C++の練習\malloc>main.exe
p address:384fc8
&p address:12ff74
p address:3830c0
&p address:12ff74
p address:3830d0
&p address:12ff74
p address:p変数が指しているアドレス。つまり、mallocで作った領域の先頭アドレス。p変数自体のアドレスは変わらない。
mallocする度に、別のヒープ領域に割り当てられていることに注意。
変数名pに惑わされない。
変数名は同じだが指している先がmallocする度に変る。
変わるということは、free(f)をreturn前に1回しても前の2つは解放できない。
<stdio.h>
<stdlib.h>
int main(void){
void *p;
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
p=malloc(4);
printf("p address:%x\n",p);
printf("&p address:%x\n",&p);
free(p);
return 0;
}
OpenCVの関数でもcreate、clone関係の関数がmallocに相当する。
最終更新:2009年12月22日 10:00