我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
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
我有一个名为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[]。
- 正在查找文档以获得PS4平台的C++中的设备信息
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何设置一个范围来提取我想要获得的信息
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 为什么我的递归函数按降序打印,然后按升序打印?
- 为什么 gcovr 会生成空覆盖率统计信息?
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 我的单例中的数组在离开函数后没有保留信息,然后在尝试再次访问信息时崩溃
- 通过将结构信息从二进制文件读取到数组中,然后返回到文件C
- 将人类可读日期转换为毫秒,然后再转换回来,而不会丢失信息
- 从控制台保存信息,然后重新打开时,信息仍然存在