※ ChatGPTを利用し、要約された質問です(原文:動的メモリ 解放がうまくいかない)
動的メモリ解放の問題とメモリ不足の原因
このQ&Aのポイント
動的メモリを解放する際に効果がないため、メモリ容量が徐々に増加し、エラーが発生しています。
ファイルを一行ずつ読み込んでデータを取得する際に、メモリを動的に確保していますが、解放する際に問題が生じています。
解放処理が正しく行われておらず、ループが進むごとにメモリ使用量が増加しています。
よろしくお願いします。
一ファイル20万行程度のCSV形式のテキストファイルが、50個ほどあります。
これを一行づつ読み込んで、strtok( ,",")でデータを取得しようと思っています。
ファイルの行数はまちまちなので、新しいファイルを読み込むときに
そのファイルの行数を調べて(ここでは count 行あります)
callocをつかって、メモリを確保しました。
btxt=(char **)calloc(count,sizeof(char *));/*動的メモリ確保*/
for(i=0;i<count;i++) btxt[i]=(char *)calloc(120,sizeof(char)); /*一行120文字まで*/
if(btxt==NULL){printf("btxt 確保エラー\n"); exit(0);}
上記btxt配列にすべての行数を読み込んで、strtok()処理をした後
for(v=0;v<120;v++){
if(btxt[v]){
free(btxt[v]);
btxt[v]=NULL;
}
}
free(btxt);
btxt=NULL;
で解放してから、次のファイルに移ります。
問題は、ループするごとにメモリ容量がどんどん減ってきて、30ループもさせると
メモリ不足でエラーが出ることです。
ブレークポイントを使って調べてみたのですが
ループ一回目 calloc前 707.7 MB: calloc後 748.6MB 解放(したつもり)後 747.9 MB
ループ二回目 calloc前 750.6 MB: calloc後 794.6MB 解放(したつもり)後 793.8 MB
・・・・・・・・・・・・・・・・・・・
ループ四回終了時には868.3MBにもなって、初めより160MBも使ってしまいます。
free()が効いてないと思うのですが、どこがおかしいのか教えてくださいませ。
お礼
だぁ~ お恥ずかしい。 何回callocして何回freeしているか。肝に銘じます。