我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃

The array in my singleton isn't keeping information after leaving a function and then it crashes when it tries to access the information again

本文关键字:信息 然后 崩溃 访问 有保留 数组 单例中 离开 函数 我的      更新时间:2023-10-16

我有一个名为int **grid的数组,它是在Amazon::initGrid()中设置的,并且被制作成一个带有new[16][16]网格。 我将每个数组值设置为 0,然后将[2][2]设置为 32。 现在,当我离开initGrid()回来时,它getGrid()它已经失去了价值,现在0x0000了。

我不知道该尝试什么,解决方案似乎非常简单,但我只是不明白。 不知何故,数据没有保存在g_amazon但我可以发布代码。

// Returns a pointer to grid
int** Amazon::getGridVal()
{
char buf[100];
sprintf_s(buf, "Hello %dn", grid[2][2]);
return grid;
}
int Amazon::initGrid()
{
int** grid = 0;
grid = new int* [16];
for (int i = 0; i < 16; i++)
{
grid[i] = new int[16];
for (int j = 0; j < 16; j++)
{
grid[i][j] = 0;
}
}

grid[2][2] = 32;
return 0;
}
int **grid;
g_amazon = Amazon::getInstance();
g_amazon->initGrid();
grid = g_amazon->getGridVal();
for (int i = 0; i < 16; i++)
{
for (int j = 0; j < 16; j++)
{
int index;
index = (width * 4 * i) + (4 * j);
int gridval;
gridval = grid[i][j];
lpBits[index] = gridval;
lpBits[index + 1] = gridval;
lpBits[index + 2] = gridval;
}
}

当我在打印出[2][2]的行运行它时它会崩溃sprintf_s当我到达gridval = grid[i][j]时它也崩溃,因为它位于内存位置0x000000。

变量

int** 网格

在 initGrid(( 函数中是一个局部变量。编辑** 当函数返回时,变量将从堆栈中弹出。但是,由于它是使用 new 运算符声明的,因此内存仍然存在于堆上;它只是没有被你的全局网格变量指向。

@Dean评论中说:

我有 grid 作为 int** 网格;在类 Amazon {} 中;所以它不应该留在内存中还是需要一个静态变量。

这就是问题所在:

Amazon::initGrid::上的本地int **grid;

是遮罩

会员int **grid;Amazon::

因为第一个上下文名称查找中具有更高的优先级。

因此initGrid()分配仅由本地指针引用的内存。当您从此函数返回时,该指针不再存在,Amazon::grid初始化时从未触及过,并且您还留下了一些错误的内存问题

因此,正如@Remy-Lebeau所评论的那样,我也建议

考虑改用 std::vector> 或 std::array, 16>。在这种情况下,没有充分的理由手动使用 new[]。