【问题标题】:Initializing a 2D array of pointers as a member variable in C++在 C++ 中将指针的二维数组初始化为成员变量
【发布时间】:2014-03-14 00:17:05
【问题描述】:

我一直在搜索 Stack Overflow 和 cplusplus 论坛,但没有成功。我是 C++ 新手,目前正在为学校项目开发游戏。我在创建、填充、销毁 2d 指针数组时没有问题,并且在我的游戏中使用了一个,它工作得很好。

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

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();
  ...
}

【问题讨论】:

  • 也许你可以使用 :vector > board(BOARD_DIMENSIONS,vector(BOARD_DIMENSIONS,0));替换 allocate_2d_array
  • 另外,我不知道您为什么希望 allocate_2d_array 可以公开访问
  • 不应该公开,复制粘贴出错。

标签: c++ class pointers dynamic-arrays


【解决方案1】:

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

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

类似:

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 []正确释放内存

【讨论】:

  • 啊!教科书业余错误...谢谢!
  • YW。正如其他人所指出的,如果这不是家庭作业,那么使用一两个 STL 数据容器可能会更好。
  • 除非我创建一个指向 Person 类的指针,否则它可以工作。例如 Person somedude;工作正常但是。某人某人=新人;仍然会产生分段错误。
  • Person somedudePerson 的一个实例;你想要一个指针。试试Person* pSomedude = new Person
  • 这就是我所拥有的,它可以编译,但是当我尝试使用上述函数时会导致分段错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多