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

标签 c++

我有一个名为 int **grid 的数组,它是在 Amazon::initGrid() 中设置的,并且是一个 [16][ 16] 网格与 。我将每个数组值设置为 0,然后将 [2][2] 设置为 32。现在,当我离开 initGrid() 并返回 getGrid() 时 它已经失去了值(value),现在是 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** grid

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

关于c++ - 我的单例中的数组在离开函数后不保留信息,然后在尝试再次访问信息时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57732283/

相关文章:

c++ - 为什么打印的值都是垃圾?我们如何解决这个问题?

c++ - 创建一个可以在 Windows 环境中的现有 makefile 项目上运行的 clang 工具?

c++ - 我应该遵循什么方向来向我的应用程序添加网络服务功能?

c++ - 将类型转换为 python

c++ - 以下哪一项在理论上更快

c++ - C++成员函数自定义类型返回 'does not name a type'错误

unix - 查找给定范围内毕达哥拉斯三元组的数量

c++ - std::string 处理短字符串的性能

c++ - 如何正确使用 boost::iterator_adaptor 来制作循环迭代器?

c++ - 使用字符串内存