クラスの二次元配列の解放について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ほげ

クラスの二次元配列の解放について

#1

投稿記事 by ほげ » 14年前

現在、シュミレーションゲームを作っている者です。
マップのセルを一つずつクラスにしてみました。
セルは10×10なので合計100マスです。
それを(擬似?)二次元配列を使ってコードを書いてみたらそのポインタ関係のAssertionエラー(BLOCK_TYPE_IS_VALID(pHead->nBlockUse))がでて、デバッグがとまってしまいます。
ブレークポイントを置いて調べたところ、deleteのところでエラーが起こっていると突き止めました。
しかし、それ以上のことが調べても分かりません。
解決方法をご教授ください。

コード:

-------------------cell.h
#ifndef CELL_H_
#define CELL_H_

class Cell{
public:
	void SetAttr(int other){attr=other;}
	void SetFlag();
	int ShowAttr(){return attr;}
private:
	int attr;//属性
	int flag;
};

#endif

--------------------------------object.h
#ifndef OBJECT_H_
#define OBJECT_H_

#include "Cell.h"
#include "define.h"

Cell (*cell)[MAP_WIDTH]=new Cell [MAP_HEIGHT][MAP_WIDTH];
#endif

---------------------------------extern.h
#ifndef EXTERN_H_
#define EXTERN_H_
#include "Object.h"
#include "define.h"

extern Cell (*cell)[MAP_WIDTH];

#endif

---------------------------ExtraFunction.cpp

void SetCellAttr(Cell (*ocell)[MAP_WIDTH]){
	for(int h=0;h<MAP_HEIGHT;h++){
		for(int w=0;w<MAP_WIDTH;w++){
			ocell[h][w].SetAttr(MapData[h][w]);//MapDataは10×10の二次元配列
		}
	}
}

------------------------------main.cpp

#include "DxLib.h"
#include "map.h"
#include "Extern.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	
	if( DxLib_Init() == -1 || ChangeWindowMode(true) == -1 || SetMouseDispFlag(true) == -1 || SetDrawScreen(DX_SCREEN_BACK)==-1)	// DXライブラリ初期化処理
	{
		 return -1;		// エラーが起きたら直ちに終了
	}

	SetCellAttr(cell);

	while(ProcessMessage()!=-1){
        DrawMap();
	}
	// キー入力待ち
	WaitKey() ;
	for(int h=0;h<MAP_HEIGHT;h++)
		delete [] cell[h];
	delete [] cell;
	DxLib_End() ;		// DXライブラリ使用の終了処理


	return 0 ;		// ソフトの終了
}

----------------------------------------map.h
void DrawMap(){// マップを描く
	int i , j ;
	for( i = 0 ; i < MAP_HEIGHT ; i ++ )
	{
		for( j = 0 ; j < MAP_WIDTH ; j ++ )
		{
			if( cell[ i ][ j ].ShowAttr() == 0 )
			{
				DrawBoxMap( j * MAP_SIZE, i * MAP_SIZE,	j * MAP_SIZE + MAP_SIZE, i * MAP_SIZE + MAP_SIZE,GetColor( 255 , 0 , 0 ) , TRUE ) ;
			}else{
				DrawBoxMap( j * MAP_SIZE, i * MAP_SIZE,	j * MAP_SIZE + MAP_SIZE, i * MAP_SIZE + MAP_SIZE,GetColor( 0 , 255 , 0 ) , TRUE ) ;
			}
		}
	}
}
以上が二次元配列cellを使っているところすべての部分です。
なお、main.cpp内の
for(int h=0;h<MAP_HEIGHT;h++)
delete [] cell[h];
のところで、h=1が入った周にdeleteしようとするとエラーであります。
また、あまりにも問題からかけ離れていると思われる部分は省略いたしました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: クラスの二次元配列の解放について

#2

投稿記事 by h2so5 » 14年前

コード:

    //for(int h=0;h<MAP_HEIGHT;h++)
        //delete [] cell[h];
    delete [] cell;
上2行は不要です。

そして、なぜobject.h内で

Cell (*cell)[MAP_WIDTH]=new Cell [MAP_HEIGHT][MAP_WIDTH];

という動的確保をしているのでしょうか?デメリットしか無いと思いますが。
SetCellAttr(cell); の前に書くのが良いかと。

ほげ

Re: クラスの二次元配列の解放について

#3

投稿記事 by ほげ » 14年前

h2so5さんのアドバイスで解決する(正しく開放する)ことができました。
いろいろなサンプルコードを見て回っていたので、混乱していたようです。
「MAP_WIDTH要素配列」へのポインタですから開放はそのポインタだけでよかったんですね。

自分がクラスの配列の静的な生成方法を知らないからです。
仕方なくネットから動的確保の方法を探し当てたというだけでたいした意味はありませんし、むしろ静的確保ができるものならそちらを使いたいと思っています。
構造体と違って何故二次元配列の確保が簡単にできないのかなぁ、と思っています。
もし静的確保の方法をご存知でしたら教えてください。

maru
記事: 150
登録日時: 14年前

Re: クラスの二次元配列の解放について

#4

投稿記事 by maru » 14年前

ほげ さんが書きました:もし静的確保の方法をご存知でしたら教えてください。
普通、静的確保って

コード:

Cell cell[MAP_HEIGHT][MAP_WIDTH];
だと思います。
なぜわざわざ難しいことをやっているのか理解に苦しむ所です。

ほげ

Re: クラスの二次元配列の解放について

#5

投稿記事 by ほげ » 14年前

>maruさん
以前にそのコードを入力したらエラーが出てしまったんですが、今回入力したところ、上手くいきました。
ほかのところがエラーの原因だったみたいです。
ご返信ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る