ページ 11

freeできない!

Posted: 2013年2月20日(水) 23:47
by つちのこ
2回目の質問申し訳ございません。
今回質問したのはfreeするとヒープが破壊されてしまい何故破壊されてしまうのか分からず質問しました。

char型のポインタをmallocし、freeしたのですが、なぜかfreeできません。
どこが原因なのでしょうか?

コード:

#include "GLOVAL.h"

#define DATA  2;//データ数
#define BUF  45;//一行目のデータ


static struct DATABASE DataBase[DATA];//データベース

//データベース
void DataBase(){

	FILE *fp;		//csvファイル

	char buff[BUF];	        //空読み用
	int i=-1;			//ID
	char csvFile[100];	//fgetsするため
	char *Data1, *Data2, *Data3, *Data4, *Data5, *Data6;//数値に変換するのに使う


	Data1 = (char *)malloc( sizeof( char ) );
	Data2 = (char *)malloc( sizeof( char ) );
	Data3 = (char *)malloc( sizeof( char ) );
	Data4 = (char *)malloc( sizeof( char ) );
	Data5 = (char *)malloc( sizeof( char ) );
	Data6 = (char *)malloc( sizeof( char ) );
	

	//----ファイルオープン----
	fp = fopen( "DataBase.csv", "r" );

	fgets( buff, sizeof( buff ), fp );//空読み
	
	//ファイル読み込み
	while( ( fgets( csvFile, sizeof( csvFile ), fp )) != NULL ){

		i++;//ID

		sscanf( Data_csv, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]", DataBase[i].name,
			Data1, Data2, Data3, Data4,
			Data5, Data6 );

		//変換
		DataBase[i].Data1 = atof( Data1 );
		DataBase[i].Data2 = atof( Data2 );
		DataBase[i].Data3 = atof( Data3 );
		DataBase[i].Data4 = atof( Data4 );
		DataBase[i].Data5 = atof( Data5 );
		DataBase[i].Data6 = atof( Data6 );
	}	
	
	//-----ファイルクローズ------
	fclose( fp );

//ここでヒープが破壊される
	free( Data1 );
	free( Data2 );
	free( Data3 );
	free( Data4 );
	free( Data5 );
	free( Data6 );

}
これで実行するとfreeの箇所でヒープが破壊されてしまいます。
何度もデバッグしてみたところ、whileの中でfreeしても破壊されず、whileの外だと破壊されてしまいます。
なので、whileのどれかと思い、弄ってみると sscanfが原因だとわかりました。(sscanfの箇所をコメントにするとfreeできる)
しかし、このsscanfなぜ原因なのかがわかりません。
どこを直せば解決するでしょうか?

Re: freeできない!

Posted: 2013年2月21日(木) 01:16
by softya(ソフト屋)
free()で破壊するのではなくヒープが壊れている事が発覚しているだけですね。
原因は、(char *)malloc( sizeof( char ) );で1バイトしか確保していない領域にもっとバイト数が必要な文字列を書き込んでしまっていることです。
文字列に必要なだけのサイズを確保して下さい。

Re: freeできない!

Posted: 2013年2月21日(木) 01:40
by つちのこ
softya様ご返信ありがとうございます。

こんな簡単なミスをしていたとは・・・。無事解決することができました。
視点が、sscanf、freeだけにいってしまってました。
今後こんなミスが無いよう色々な視点から間違いを見つけたいと思います。

夜遅くにご返信ありがとうございます。