malloc,freeとメモリリーク

malloc,freeとメモリリークについておさらい。


/* malloc と free の使い方 */

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int *i_array;
int buf_size;
int i;

/* バッファサイズ決定 */
printf("バッファサイズを入力してください\n");
scanf("%d",&buf_size);

/* メモリを確保 */
i_array = (int *)malloc( buf_size * sizeof(int) );
if(i_array == NULL) {
printf("メモリが確保できません\n");
exit(1);
}

/* 処理 */
for(i=0;i<buf_size;i++){
i_array[i] = i*i;
}
for(i=0;i<buf_size;i++){
printf("%d ",i_array[i]);
}
printf("\n");

/* メモリの解放 */
free(i_array);

return 0;
}

パソコンのお手軽系言語になれると忘れがちなのが、メモリリーク。しかし、メモリ資源が乏しく、かつ長期間連続稼動する組み込み系ではメモリリークは致命的な問題となります。
ある関数 a() で確保したメモリを、別の関数 b() で解放するようなコードを書くと、メモリリークが起こるおそれがありますし、逆にデータの破壊が起こるおそれもありますね。b() がメモリを解放したかどうか、a() はあずかり知らないわけですから。またメモリの確保・解放をおこなう関数内でreturnが複数箇所あったりする場合、メモリを解放せずにreturnしてしまう抜け道ができないように気をつけないといけません。
つまり、メモリの確保と開放は同じ関数の同じ階層で記述し、抜け道を作らない。
ちなみに、C++で、new と delete を使って上のコードと同様の処理を書くと、

/* new と delete の使い方 */

#include <iostream>

int main()
{
int *i_array;
int buf_size;
int i;

/* バッファサイズ決定 */
std::cout << "バッファサイズを入力してください" << std::endl;
std::cin >> buf_size;

/* メモリを確保 */
i_array = new int[buf_size];

/* 処理 */
for(i=0;i<buf_size;i++){
i_array[i] = i*i;
}
for(i=0;i<buf_size;i++){
std::cout << i_array[i] << ' ';
}
std::cout << std::endl;

/* メモリの解放 */
delete [] i_array;

return 0;
}