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

问题描述

我有一个名为的数组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。

标签: c++

解决方案


变量

int** 网格

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


推荐阅读