C ++ - 将2D数组指针初始化为成员变量。

时间:2014-03-14 00:17:05

标签: c++ class pointers dynamic-arrays

我一直在寻找堆栈溢出和cplusplus论坛,没有运气。我是c ++的新手,我目前正在为一个学校项目开发游戏。我没有问题创建,填充,销毁一个二维指针数组,并在我的游戏中使用一个,它工作得很好。

我为玩家创建了一个新类,并将2d数组移动到该类中。现在,当我尝试运行程序时,我遇到了分段错误。任何人都可以告诉我为什么会这样吗? 粗体我不能简单地使用std :: vector<>因为指针的2d数组是必需的。

class Player
{
public:
  Player();
  ...
  short** allocate_2d_array();
  ....
protected:
  short **board;
  static const short BOARD_DIMENSIONS;
  ...
};

功能

short** Player::allocate_2d_array()
{
  short **array2d;

  // Insert columns
  for(int i = 0; i < this->BOARD_DIMENSIONS; i++)
  {
    array2d[i] = new short[this->BOARD_DIMENSIONS];
    // Fill in the numbers
    for(int j = 0; j < this->BOARD_DIMENSIONS; j++)
    {
      array2d[i][j] = 0;
    }
  }

  return array2d;
}

它被称为

Player::Player()
{
  this->turns_taken = 0;
  // Prepare the board
  this->board = this->allocate_2d_array();
  ...
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

for循环体的第一行在为其分配任何内存或初始化之前取消引用指针array2d(使用方括号运算符)。

要避免此问题,您必须在输入for循环之前分配数组的第一个维度。一旦分配了这个指针数组,就可以分配BOARD_DIMENSIONSshort数组,并将指针存储在第一个数组的元素中。

类似的东西:

short** array2d = new short*[BOARD_DIMENSIONS];
for (size_t u = 0; u < BOARD_DIMENSIONS; ++u)
{
    array2d[u] = new short[BOARD_DIMENSIONS];
    // You could then use memset to initialize the array, or
    // use a for loop, like in your example:
    for (size_t v = 0; v < BOARD_DIMENSIONS; ++v)
    {
        array2d[u][v] = 0;
    }
 }

使用operator delete []

确保完成正确释放的内存