画像の枚数、サイズなどをまとめて管理できるクラスを作ったのですが、
初めて動的配列を使うのでメモリリークなどが起きないか心配です。
最初は自動で確保と解放をしてくれる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 );
}
}
newで確保した配列を解放するとき、
delete [] mp_Handle;、
とやっているのですが、
mp_Handle = new int;
で確保した場合でも問題ないのでしょうか?
mp_Handle = new int[1];
の方がいいのでしょうか?
不安点2
デストラクタでメモリを解放するようにしていますが、
これでも、メモリリークを起こす可能性はあるのでしょうか?
エラーで強制終了した場合などは、デストラクタは呼ばれないのでしょうか?