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;
}
==
すみません、とても基本的なことなのだろうと思うのですが、ぜひ教えてください。
お礼
回答ありがとうございます。 なるほど。サイトルート相対パスで指定すれば出来そうですね。 試してみたいと思います。