[英]C++ Dynamic multidimensional array problem
我正在開發2D平台。 一切都很好,直到我有一些難以解決的問題為止。 級別圖存儲在動態多維數組(char ** map)中。 它工作正常,直到我要重新定義它
這是代碼的一部分:
Map& Map::operator=(const Map& rhs)
{
if(width!=0||height!=0)
{
for(int i=0;i<width;i++)
delete[] map[i];
delete[] map;
} //deleting previously created array
height=rhs.height;
width=rhs.width; //receiving other map's size
map=new char* [width];
walkmap=new unsigned char* [width];
objmap=new char* [width];
for(int i=0;i<width;i++)
{
*(map+i)=new char[height];
} //creating new array
for(int h=0;h<height;h++)
for(int w=0;w<width;w++)
{
map[w][h]=rhs.map[w][h];
} //receiving new values
//...
}
第一次一切正常,但是當我第二次需要重新定義數組時,當數組從另一個數組接收新值時,我的程序崩潰了。 可能是我錯過了一些東西,但是找不到! 我正在搜索此問題,但沒有發現我在做什么錯。 請幫幫我。
與往常一樣,Boost具有優雅且高效存儲的多維數組類:
http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html
例如,要設置10 x 20的布爾值數組:
boost::multi_array mtaFlagMatrix(boost::extents[10][20]);
然后訪問其元素:
mtaFlagMatrix[2][6] = false; // indexes are zero-based - just like normal C arrays
...
if ( mtaFlagMatrix[2][6] )
{
...
}
然后,您可以通過這種方式調整數組的大小(保留現有值):
typedef boost::multi_array array_type;
array_type::extent_gen extents; array_type A(extents[3][3][3]); A[0][0][0] = 4; A[2][2][2] = 5; A.resize(extents[2][3][4]); assert(A[0][0][0] == 4); // A[2][2][2] is no longer valid.
這為我節省了很多測試極端情況的時間。
您的2d數組未正確釋放。 我建議您使用Iliffe分配2d數組的方式,這種方式使用起來更快,更安全:
char** alloc_array( int h, int w )
{
typedef char* cptr;
int i;
char** m = new cptr[h];
m[0] = new char[h*w];
for(i=1;i<h;i++) m[i] = m[i-1]+w;
return m;
}
void release_array(char** m)
{
delete[] m[0];
delete[] m;
}
int main()
{
int r,c;
char** tab;
int width = 5;
int height = 3;
tab = alloc_array(height, width); /* column first */
for(r = 0;r<height;++r)
for(c = 0;c<width;++c)
tab[r][c] = (1+r+c);
for(r = 0;r<height;++r)
{
for(c = 0;c<width;++c)
{
printf("%d\t",tab[r][c]);
}
puts("");
}
release_array(tab);
}
可以很容易地將其封裝在整潔的2d數組類中,或者使用std :: vector而不是原始分配。 最好采用這種2d數組的方式,因為它是緩存友好的,樣式提供[] []訪問,並且比多項式1d訪問更慢,而且更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.