ページ 11

二重ポインタが上手くいきません

Posted: 2014年7月23日(水) 19:17
by grayf
こんにちは。C++を独学で勉強中のものです。
googleのストリートビューの劣化版のようなものを作ろうと思い、カプセル化を意識した結果、
以下のようなコードになりました。(かなり省略してますが)

おそらく、文法的に問題ない気がするのですがコンパイルに引っかかりました。
(「ハンドルされない例外が発生し、読み取り中にアクセス違反が発生しました」というエラーです)
ウィンドウを閉じてから機能を停止するので当初は問題なかったのですが、後々class内の関数でmap** mを使う処理
を実装することができなくなるので質問させて頂きました。

エラーが発生しなくなるにはどうすれば良いのでしょうか?

開発環境はVisual Stdio Express C++ 2013 for Windows desktopで、OSはWindows 8.1です。

コード:

class map{
public:
	int graph[5];
	int event;
};

class field{
private:
	int w;
	int h;
	string name_;
	map**m;
public:
	~field(){
		delete m;
	}

	void  f_set(int x,int y,string name){
		w = x;                                                             
		h = y;

		m = new map*[w];
		m[0] = new map[w * h];
		for (int i = 1; i < w; i++) m[i] = m[0] + i * h;

		name_ = name;
		string path = ("photo\\");
		path += name;
		for (int x = 0; x < w; x++){
			for (int y = 0; y < h; y++){
				for (int i = 1; i <=4; i++){
					string pa = path;
					pa += IntToString(x);
					pa += IntToString(y);
					pa += IntToString(i);
					pa += (".png");
					m[x][y].graph[i] = LoadGraph(pa.c_str());
				}
			}
		}
	}	
};

Re: 二重ポインタが上手くいきません

Posted: 2014年7月23日(水) 20:40
by みけCAT
new 型名[要素数]で確保した配列は、deleteではなくdelete[]で開放するべきです。
また、今のプログラムだとm[0]を開放していないように見えます。
オフトピック
grayf さんが書きました:おそらく、文法的に問題ない気がするのですがコンパイルに引っかかりました。
(「ハンドルされない例外が発生し、読み取り中にアクセス違反が発生しました」というエラーです)
ぷよぷよを作った会社に怒られたのでしょうか…?

Re: 二重ポインタが上手くいきません

Posted: 2014年7月23日(水) 21:02
by grayf
回答ありがとうございます。
"delete m;" の後に"delete []m;" を加えてみました。

ですが、依然エラーは表示されます。他に原因らしきものなどはないでしょうか?

Re: 二重ポインタが上手くいきません

Posted: 2014年7月23日(水) 21:27
by grayf
自己解決しました。

上げたソース外のm[w][h]を使う関数の方に問題がありました。

それでも、イマイチよく分からないバグが発生したのですが動作に支障は来たさないようなので、これで解決ということにします。