繁体   English   中英

C ++动态多维数组问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM