【问题标题】:Issues with an infinite loop when setting up a two dimenstial array of pointers设置二维指针数组时的无限循环问题
【发布时间】:2020-09-23 22:00:19
【问题描述】:

我正在尝试设置一个二维指针数组,但是我在实际分配内存时遇到了问题。每当我尝试将值写入数组时,都会出现访问写入位置错误。

网格.h

class Grid 
{
public:
    Grid();

private:
    int x;
    int y;
    int row;
    int col;
    Grid*** array2D;
    
};

Grid.cpp

Grid::Grid()
{
    row = 32;
    col = 30;

     // Allocate memory to point to.
    array2D = new Grid**[row];
    for (int i = 0; i < row; i++) {
        array2D[i] = new Grid*[col];
        }


    for (int i = 0; i <= row; i++)
    {
        for (int j = 0; j <= col; j++)
        {
            array2D[i][j]->x=6;
            array2D[i][j]->y =5;
            
        }
    }
Unhandled exception at 0x000C1CC8 in Project.exe: 0xC0000005: Access violation writing location 0xCDCDCE29.

Exception thrown at 0x000C1CC8 in Project.exe: 0xC0000005: Access violation writing location 0xCDCDCE29.

【问题讨论】:

  • 为什么需要一个指向Grid 对象的指针 数组?您的 Grid 对象是否存储在内存中的其他位置?如果不是,为什么不使用 actual Grid 对象数组来代替?您可以很好地分配数组本身(尽管使用 std::vector 比使用 new[] 更好),但是您没有将 Grid* 元素分配为实际指向任何地方,这就是代码崩溃的原因。此外,您的第二组循环超出了数组维度的范围,请使用 &lt; 而不是 &lt;=
  • 看起来你已经创建了行和列,但不是Grids。您需要在第一个循环中迭代列并生成它们。不过还有另一个问题,Grid 包含一个自身的数组。我不完全明白这个概念,但它看起来像一个无限递归。
  • @NO_NAME 关于潜在的无限递归的好点,我错过了。
  • 顺便说一句,我真的不鼓励在如此低的水平上管理内存,除非这个程序是为了专门学习这一点。您应该使用一些更高级别的构造,例如std::unique_ptrstd::vector,这会使您更难犯错误并记住以释放内存。你的数组的等价物类似于std::vector&lt;std::vector&lt;std::unique_ptr&lt;Grid&gt;&gt;&gt;(取决于你真正想做的事情)。这可能看起来很吓人,但实际上很容易使用。
  • 如果只需要一个固定大小的数组,就不需要动态分配内存。这不是 Java。您只需写 Grid array2D[32][30]; 并收工。

标签: c++ arrays pointers multidimensional-array datagrid


【解决方案1】:

在提供的代码中,内存已分配给Grid***Grid**,但没有分配给Grid*,网格本身也从未被初始化。所以在最后一级,指针array[x][y] 持有一个无意义的值,它可能指向一些不相关的地方,所以Access violation 错误!

您应该首先分配并可能初始化最后一级指针,如下所示:

array2D[i][j] = new Grid;

然后才尝试访问其元素,例如:

array2D[i][j]->x=6;
array2D[i][j]->y =5;

也别忘了纠正:

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)

另一种解决方案是简单地从代码中删除一个* 并放置一个默认构造函数以避免构造循环,如下所示: 网格.h

class Grid
{
public:
    Grid() = default;
    Grid(int);

private:
    int x;
    int y;
    int row;
    int col;
    Grid** array2D;
};

Grid.cpp

Grid::Grid(int)
{
    row = 32;
    col = 30;
    x=0;
    y=0;

     // Allocate memory to point to.
    array2D = new Grid*[row];
    for (int i = 0; i < row; i++) {
        array2D[i] = new Grid[col];
        }

    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            (array2D[i][j]).x=6;
            (array2D[i][j]).y =5;
       }
    }
}

示例用法:

int main()
{
    Grid grid(0);
    std::cout<<"the end" << std::endl;
    return 0;
}

【讨论】:

  • 是的,我仍然遇到的问题是递归循环,因为如果我要分配 array2D[i][j]= new Grid;它会循环回到第一个 for 循环。
  • 为什么要回到那里?只需将其更改为 ``` for (int i = 0; i x=6;数组2D[i][j]->y =5; } } ```
  • 顺便说一句,为什么不用 Grid** array2D; 而不是 Grid*** array2D; ?那么你甚至不需要在最后一层为新的 Grid 分配内存!
  • 我原本拥有 Grid ** array2D 但是,这仍然会导致这里的递归问题。 array2D = 新网格 * [行]; for (int i = 0; i
  • @Jay 你能至少解释一下你想要达到什么目的吗?我不明白这怎么会导致无限循环!你是想制作一个链接节点还是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多