c++ - 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
问题描述
我有一个名为的数组int **grid
,它被设置Amazon::initGrid()
并被制作成一个[16][16]
带有new
. 我将每个数组值设置为 0,然后设置[2][2]
为 32。现在,当我离开initGrid()
并返回时,getGrid()
它已经失去了它的值,现在是 0x0000。
我不知道该尝试什么,解决方案似乎很简单,但我就是不明白。不知何故,数据没有被保存,g_amazon
但我可以发布代码。
// Returns a pointer to grid
int** Amazon::getGridVal()
{
char buf[100];
sprintf_s(buf, "Hello %d\n", 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;
}
}
sprintf_s
当我在打印出来的行运行它时[2][2]
它会崩溃,当我到达时它也会崩溃,gridval = grid[i][j]
因为它位于内存位置 0x000000。
解决方案
变量
int** 网格
initGrid() 函数中是一个局部变量。编辑** 当函数返回时,变量从堆栈中弹出。但是,由于它是用 new 运算符声明的,所以内存仍然存在于堆上;它只是没有被您的全局网格变量指向。
推荐阅读
- firebase - 反应原生火炉
- python - 将熊猫数据框中的无效日期转换为最近的有效日期
- python - Altair Chart 从 TimeStamps 中“读取”的信息超出其应有的范围
- reactjs - 如何使用样式组件覆盖 .styl 文件中的属性?
- java - 使用没有循环和乘法的递归调用来查找值
- datepicker - 给定 UTC 日期,您如何正确设置 Adaptive Card - Date Picker 的值?
- ios - 如何从 TableViewCell 中的单元格激活滑块 IBAction?
- c++ - 如何确保 MPI 异步调用并行执行?
- reactjs - ReactJS Material Table 可以显示一个布尔值吗
- python - Pandas:如何计算 groupby 的平均值