C メモリの解放について
Cで書いたコードを動かすと、ヒープが壊れてたというエラーが出るようになりました。
freeなどで、自分なりに調べてメモリを解放したつもりですが、
その後また再発するようになったので、すみません、どの変数をどう解放するべきか、アドバイスをいただけると助かります。OpenCVの関数を使っています。
内容は、Aというファイルに20枚のテンプレートBを当てて近似値をとり、それを1行の文字列にしてCSVに保存する、というものです。
======
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <string.h>
#define snprintf _snprintf
#include <errno.h>
#include <math.h>
int
main (void)
{
FILE *fp;
char str[60], str2[200], str3[200];
int i,ii;
double result[20];
CvFont font;
IplImage *src_img1, *src_img2, *src_img3;
IplImage *dst_img[1];
IplImage *fresh_img,*mask_img;
char *fname = "C:\\Documents and Settings\\...\\result.csv";
char kugiri[]=",";
result[ii]=NULL;
free(str2);
fp = fopen( fname, "w" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}
//ファイルA=src_img1
src_img1 = cvLoadImage ("C:\\Documents and Settings\\...\\2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
for (ii=0; ii<20; ii++) {
sprintf(str,"%s%d%s","C:\\Documents and Settings\\...\\",ii, ".png");
//ファイルB=src_img2
src_img2 = cvLoadImage (str, CV_LOAD_IMAGE_GRAYSCALE);
//テンプレートのファイルBを、比較用にコピーしています
dst_img[0] = (IplImage *) cvClone (src_img2);
//result[ii]には近似値が格納されます
result[ii] = cvMatchShapes (src_img1, src_img2, CV_CONTOURS_MATCH_I1, 0);
//ここで ↓ エラーが出るので、型がおかしいのかと直していたのですがヒープが壊れて直せなくなりました。str2に、近似値の結果+区切り文字(カンマ)をテンプレート枚数(20)回ループで回して文字連結して格納したいのです。近似値は小数点6ケタまであればいいので、floatでいいと思ったのですが違うでしょうか。
sprintf(str2,"%f%s",result[ii],kugiri);
if (ii==0){
sprintf(str3,"%s",str2);
return -1;
}
sprintf(str3,"%s%s",str3,str2);
//メモリの解放
cvReleaseImage(&src_img2);
cvReleaseImage(&dst_img[0]);
free(str2);
result[ii]=NULL;
printf("%f",str3);
}
fprintf(fp, "%s", str3);
fclose( fp );
free(str3);
return 0;
}
==
すみません、とても基本的なことなのだろうと思うのですが、ぜひ教えてください。
お礼
アプリケーションを終了させるタイミングで解放してくれているってことなんでしょうかね。 ASPは、ずっと起動しっぱなしなので、 余計に意識して解放する必要があるのでしょうね。 ありがとうございました。