C言語のプログラムのメモリリークに関して
動的メモリ管理を用いて,キーボードからの入力を行単位で辞書順にソートして出力するプログラムで、メモリリークが有るため解消したいのですが、freeをどのように用いれば良いのかが分かりません。
動的メモリについての理解が不十分であるため、自分なりにfreeを用いてみるとプログラムが途中で止まってしまい、解消することができません。
以下のプログラムは、自分なりにfreeを用いた部分を除けば、ソート後の出力は正しく出力されます。(メモリリークは発生します。)
アドバイス、間違いの指摘等していただければと思います。お願いします。
環境は、Windows XP Professional SP3 32bitでVisual C++ 2008 Expressを使用しています。
#include <stdio.h>
#include <string.h>
#include <crtdbg.h>
#include <stdlib.h>
#define MAXLINES 20000 // 最大行数
#define LINELENGTH 20 // 1行の最大文字数
/* 標準入力からの入力を,一行づつ動的に確保したメモリに格納し,
そのアドレスを文字列へのポインタ配列に保存する.
Ctrl+Zで入力を終了する.
lines : 文字列へのポインタの配列
numMax : 最大の読み込み行数*/
int ReadLines(char *lines[], int numMax){
int cnt = 0;
static char buf[LINELENGTH];
while (cnt < numMax && gets(buf)) {
lines[cnt] = malloc(strlen(buf) + 1);
if (lines[cnt] == NULL) {
printf("Allocation error.\n");
break;
}
strcpy(lines[cnt], buf);
cnt++;
}
return cnt;
}
/* ポインタ配列の指す文字列を標準出力に表示
lines : 文字列へのポインタの配列
num : 行数*/
void PrintLines(char *lines[], int num){
int i;
for (i = 0;i < num;i++)
printf("%s\n", lines[i]);
}
/* ポインタの配列を,辞書順にソート
lines : 文字列へのポインタの配列
num : 行数*/
void Sort(char *lines[], int num){
int i,j;
char temp[LINELENGTH];
for(i=0;i<num;i++){
for(j=num-1;j>i;j--){
if(strcmp(lines[j],lines[j-1])<0){
strcpy(temp,lines[j]);
strcpy(lines[j],lines[j-1]);
strcpy(lines[j-1],temp);
}
}
}
}
int main(){
int cnt,i;
static char *lines[MAXLINES];
cnt = ReadLines(lines, MAXLINES);
printf("----- %d lines -----\n", cnt);
Sort(lines, cnt);
PrintLines(lines, cnt);
/*自分なりにfreeを用いた部分*/
for(i=0;i<cnt;i++){
free(lines[i]);
}
//メモリリーク情報の表示
_CrtDumpMemoryLeaks();
return 0;
}
補足
ご回答ありがとうございます。 よろしければ回答No.1の補足からソースをみて頂けませんでしょうか? こちらでもご指摘の点を重点的に確認いたします。