動的配列を使用した画像管理クラス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

動的配列を使用した画像管理クラス

#1

投稿記事 by YYSS » 7年前

こんばんは、Dxライブラリを使ってSTGを作ろうとしている者です。

画像の枚数、サイズなどをまとめて管理できるクラスを作ったのですが、
初めて動的配列を使うのでメモリリークなどが起きないか心配です。

最初は自動で確保と解放をしてくれるvectorでやろうかと思いましたが、
LoadDivGraphの配列指定でうまくいきませんでした;;

読み込む画像は
「1枚のみ」
「赤橙黄緑青」

赤赤赤赤赤赤(コマ画像)
青青青青青青(コマ画像)

など様々です。

作ったクラスと不安点を書きますので、指摘箇所があれば言って下さると幸いです。
逆に無ければ、「そのクラスで問題ないよ」 という意見を下さるとなお幸いです。

コード:

class C_ImgHandle{
	
private:
	int		*mp_Handle;			//	画像ハンドルのポインタ
	int		m_Num;				//	画像の数
	int		m_KomaNum;			//	アニメーション画像の場合の最大コマ数
	int		m_ColorNum;			//	カラーの種類
	int		m_SizeX, m_SizeY;	//	画像1枚当たりのXYピクセル数
	int		m_HitScale[2];		//	当たり判定の大きさ
	
public:
	C_ImgHandle();
	~C_ImgHandle();

	void	Init();			//	全メンバ初期化
	void	MemoryClear();	//	new解放

	//	1枚画像読み込みと分割画像読み込みで分ける
	int		LoadImg( char *pass, int hp1 = 0, int hp2 = 0 );
	int		LoadImg( char *pass, int num, int xNum, int yNum, int xSize, int ySize, int color = 1, int koma = 1, int hp1 = 0, int hp2 = 0 );
	
	int		*GetHandle(){				return mp_Handle;	}
	int		*GetHandle( int color );
	
	int		*GetHitScale(){		return m_HitScale;	}
		
};

コード:

C_ImgHandle::C_ImgHandle(){
	Init();
	mp_Handle	= NULL;
}
C_ImgHandle::~C_ImgHandle(){
	printfDx( "デストラ" );
	MemoryClear();
}

void C_ImgHandle::MemoryClear(){

	delete [] mp_Handle;	//	NULL deleteは安全が保証
	mp_Handle	= NULL;		//	解放したらNULLポインタを入れとく

}

void C_ImgHandle::Init(){

	m_Num			= 0;
	m_KomaNum		= 0;
	m_ColorNum		= 0;
	m_HitScale[0]	= 0;
	m_HitScale[1]	= 0;
	m_SizeX			= 0;
	m_SizeY			= 0;
}

int C_ImgHandle::LoadImg( char *pass, int hp1, int hp2 ){
	
	MemoryClear();

	mp_Handle	= new int;		//	読み込む画像の分だけ配列確保

	*mp_Handle		= LoadGraph( pass );

	m_Num			= 1;
	m_KomaNum		= 1;		//	コマ数が1なら、その画像は1枚だけということにする
	m_ColorNum		= 1;		//	カラーが1なら、その画像は単色(1色のみ)にする

	GetGraphSize( *mp_Handle, &m_SizeX, &m_SizeY );		//	サイズ取得

	m_HitScale[0]	= hp1;
	m_HitScale[1]	= hp2;

	return 0;
}

int C_ImgHandle::LoadImg( char *pass, int num, int xNum, int yNum, int xSize, int ySize, int color, int koma, int hp1, int hp2 ){
	
	MemoryClear();

	mp_Handle	= new int[ num ];	//	読み込む画像の分だけ配列確保

	m_Num			= num;
	m_KomaNum		= koma;		//	コマ数が1なら、その画像は1枚だけということにする
	m_ColorNum		= color;	//	カラーが1なら、その画像は単色(1色のみ)にする
	m_SizeX			= xSize;
	m_SizeY			= ySize;
	m_HitScale[0]	= hp1;
	m_HitScale[1]	= hp2;

	LoadDivGraph( pass, m_Num, xNum, yNum, m_SizeX, m_SizeY, mp_Handle );
	
	return 0;
}

int	*C_ImgHandle::GetHandle( int color ){

	if( m_ColorNum < color ){
		printfDx( "その色は存在しない" );
		return NULL;
	}

	//	コマ画像分ポインタを動かす
	if( 1 < m_KomaNum ){
		return ( mp_Handle + ( m_KomaNum * color ) );
	}
	//	色指定分動かす
	else{
		return ( mp_Handle + color );
	}
}
不安点1
 newで確保した配列を解放するとき、
 delete [] mp_Handle;、
 とやっているのですが、
 mp_Handle = new int;
 で確保した場合でも問題ないのでしょうか?
 mp_Handle = new int[1];
 の方がいいのでしょうか?

不安点2
 デストラクタでメモリを解放するようにしていますが、
 これでも、メモリリークを起こす可能性はあるのでしょうか?
 エラーで強制終了した場合などは、デストラクタは呼ばれないのでしょうか?

nil
記事: 428
登録日時: 8年前

Re: 動的配列を使用した画像管理クラス

#2

投稿記事 by nil » 7年前

不安点1
new intなどで確保したメモリを
delete[]を使って解放した場合の動作は不定のはずです。
new int[1]にしたほうがいいでしょう

不安点2
メモリリークのチェックは_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
を使えばできます。

アバター
YYSS
記事: 125
登録日時: 9年前
連絡を取る:

Re: 動的配列を使用した画像管理クラス

#3

投稿記事 by YYSS » 7年前

涼雅 さんが書きました:不安点1
new intなどで確保したメモリを
delete[]を使って解放した場合の動作は不定のはずです。
new int[1]にしたほうがいいでしょう
new int[1]にすることにします。
涼雅 さんが書きました: 不安点2
メモリリークのチェックは_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
を使えばできます。
メモリリークのチェックをする方法があるとは知りませんでした;;
一度解放し損ねたら終わりだと思ってました;;


アドバイスありがとうございます!

閉鎖

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