ページ 11

string型を動的確保して解放するとエラーが出ます

Posted: 2013年3月03日(日) 15:54
by taketoshi
以下のようにstring型の二次元配列を動的確保して解放すると
プログラム終了時にBlock_Type_IS_VALIDと怒られます。

string型ってポインタでも自動的に解放してくれるのでしょうか?

コード:

//変数定義
	static string **MoveDirection;

コード:


//確保と解放処理
	int size = s_map.width;
	int size2 = s_map.height;
	//目的地に行くまでの経路を保存するstring型の二次元配列を用意する
	MoveDirection = new string *[size];
	for(i = 0;i < size;++i){
		MoveDirection[i] = new string[size2];
	}

	//キャラクタの経路情報を記録した配列を解放
	for(i = 0;i < size;++i){
		delete MoveDirection[i];
	}
	delete MoveDirection;


Re: string型を動的確保して解放するとエラーが出ます

Posted: 2013年3月03日(日) 16:09
by softya(ソフト屋)
delete []していなからだと思います。
「C++編(言語解説) 第12章 new/delete」
http://www.geocities.jp/ky_webid/cpp/language/012.html

Re: string型を動的確保して解放するとエラーが出ます

Posted: 2013年3月03日(日) 23:15
by taketoshi
softyaさんありがとうございます。

かなり基本的な事でした。解決といたします。
ポインタ配列を解放するのは[]がいるんですね、

#他にもint型の多次元配列を似たように確保→解放していたのですが
#エラーを吐くのはstring型だけでした。int型は何事もなかったかのように終了しちゃうんですね。。。

Re: string型を動的確保して解放するとエラーが出ます

Posted: 2013年3月03日(日) 23:24
by softya(ソフト屋)
taketoshi さんが書きました:softyaさんありがとうございます。

かなり基本的な事でした。解決といたします。
ポインタ配列を解放するのは[]がいるんですね、

#他にもint型の多次元配列を似たように確保→解放していたのですが
#エラーを吐くのはstring型だけでした。int型は何事もなかったかのように終了しちゃうんですね。。。
それはデストラクタの問題です。
intは基本型なのでデストラクタが働く必要がないからでstringはクラスですのでデストラクタが動作しないとマズイですから。

【追記】 new/deleteではなくSTLのvectorでvector<string>として管理していただいたほうがメモリリークの問題を回避できるのでお勧めです。

Re: string型を動的確保して解放するとエラーが出ます

Posted: 2013年3月04日(月) 22:52
by taketoshi
重ねてありがとうございます。デストラクタの問題だったんですね。

STLのvector<string>も使ったことがあるので、なんとなく理解できます。
必要に応じて使っていきます。