C++でnew で作成した(ヒープ領域に作成した)配列の大きさはsizeofでは取得できない。

C++でnew で作成した(ヒープ領域に作成した)配列の大きさはsizeofでは取得できない。

#include

//テスト用のどうでもいいクラス
//変数二つ用意しているのはクラスのサイズが4byteだと
//アドレスのサイズと見分けがつかないので
class Hoge{
int a;
int b;
};

//スタックの配列の長さを求める場合
int main(const int arg){
Hoge hoge[20];

int one = sizeof(Hoge); //クラスのサイズ
int all = sizeof(hoge); //配列全体のサイズ
int len = all/one; //配列の長さ

printf("%d %d %d",one,all,len);
//実行結果
//8 160 20
return 0;
}
/*
//newなりmallocなりを使ったヒープの配列の長さの場合
int main(const int arg){
Hoge* hoge = new Hoge[20];

int one = sizeof(Hoge); //クラスのサイズ
int all = sizeof(hoge); //配列全体のサイズ
int len = all/one; //配列の長さ

printf("%d %d %d",ne,all,len);
//実行結果
//8 4 0
return 0;
}
*/

そこで

CanOneMoveDirections = new Direction*[RY+1]
{
new Direction[1]{ NONE },//空
new Direction[2]{ UPPER,NONE },//歩
new Direction[1]{ NONE },//香
new Direction[3]{ UPPER2_LEFT,UPPER2_RIGHT,NONE },//桂馬
new Direction[6]{ UPPER,UPPER_LEFT,UPPER_RIGHT,LOWER_LEFT,LOWER_RIGHT,NONE },//銀
new Direction[7]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER ,NONE},//金
new Direction[1]{ NONE },//角
new Direction[1]{ NONE },//飛車
new Direction[9]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER,LOWER_LEFT,LOWER_RIGHT ,NONE},//王
new Direction[7]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER,NONE },//と金
new Direction[7]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER,NONE },//成香
new Direction[7]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER,NONE },//成桂
new Direction[7]{ UPPER,UPPER_LEFT,UPPER_RIGHT,RIGHT,LEFT,LOWER,NONE },//成銀
new Direction[5]{ UPPER,RIGHT,LEFT,LOWER,NONE },//馬
new Direction[5]{ UPPER_LEFT,UPPER_RIGHT,LOWER_LEFT,LOWER_RIGHT,NONE } //竜
};

のように最後に番兵を配置することによって解決した。

Post a comment or leave a trackback: Trackback URL.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です