Место чтения нарушения прав доступа в динамическом массиве 4D

Я получаю сообщение об ошибке "Место чтения с нарушением прав доступа" в моей программе при попытке доступа к элементам моего динамического массива 4D

Вот мой код размещения

void mazeGen(int**** mazes, int width, int height,stack<SDL_Point> backtracker)
{
    numberOfCalls++;
    //first choose a starting location for the maze
    //starting location must be odd in order to ensure that the generator does not go outside
    //the maze bounds.

    //allocate memory for the mazes
    mazes = new int***[NUMHOR];
    for (int i = 0; i < NUMVER; i++)
    {
        mazes[i] = new int**[NUMVER];
    }
    //allocate memory for the actual mazes
    for (int x = 0; x < NUMHOR; x++)
    {
        for (int y = 0; y < NUMVER; y++)
        {
            mazes[x][y] = initMaze(WIDTH, HEIGHT);
        }
    }
    //mazeGenHelper(maze, height, width, backtracker, start);
    bool leftToRight = true;
    for (int x = 0; x < NUMHOR; x++)
    {
        for (int y = 0; y < NUMVER; y++)
        {
            //generate mazes
            SDL_Point* start = new SDL_Point();
            //genx
            do
            {
                start->x = generateRandomRange(1, width - 1);
            } while (start->x % 2 == 0);
            //gen y
            do
            {
                start->y = generateRandomRange(1, height - 1);
            } while (start->y % 2 == 0);
            //empty stack
            while (!backtracker.empty())
            {
                backtracker.pop();
            }
            mazeGenHelper(mazes[x][y], HEIGHT, WIDTH, backtracker, start);
            //delete start to prevent memory leak
            delete start;
        }
    }
}

Вот и все остальное (это программа создания лабиринта на случай, если ты не сможешь сказать)

void mazeGenHelper(int** maze, int height, int width, stack<SDL_Point> backtracker, SDL_Point* point,SDL_Point* endPoint)
{
    numberOfCalls++;
    array<int, 4> directions = shuffleDirections();
    for (int i = 0; i < 4; i++)
    {
        switch (directions[i])
        {
        case 1://up
        {
                  if (point->y - 2 > 0 && maze[point->x][point->y - 2] == 1)
                  {
                      //delete maze walls
                      maze[point->x][point->y - 1] = 0;
                      maze[point->x][point->y - 2] = 0;
                      //add current point to the backtracker
                      SDL_Point newPoint = { point->x, point->y };
                      backtracker.push(newPoint);
                      //move the current point
                      point->y -= 2;
                      mazeGenHelper(maze, height, width, backtracker, point,endPoint);
                  }
        }
        case 2://right
        {
                   if (point->x + 2 <width && maze[point->x+2][point->y] == 1)
                   {
                       //delete maze walls
                       maze[point->x+1][point->y] = 0;
                       maze[point->x+2][point->y] = 0;
                       //add current point to the backtracker
                       SDL_Point newPoint = { point->x, point->y };
                       backtracker.push(newPoint);
                       //move the current point
                       point->x += 2;
                       mazeGenHelper(maze, height, width, backtracker, point,endPoint);
                   }
        }
        case 3://down
        {
                   if (point->y + 2 < height && maze[point->x][point->y + 2] == 1)
                   {
                       //delete maze walls
                       maze[point->x][point->y + 1] = 0;
                       maze[point->x][point->y + 2] = 0;
                       //add current point to the backtracker
                       SDL_Point newPoint = { point->x, point->y };
                       backtracker.push(newPoint);
                       //move the current point
                       point->y += 2;
                       mazeGenHelper(maze, height, width, backtracker, point,endPoint);
                   }
        }
        case 4://left
        {
                  if (point->x - 2 > 0 && maze[point->x - 2][point->y] == 1)
                  {
                      //delete maze walls
                      maze[point->x - 1][point->y] = 0;
                      maze[point->x - 2][point->y] = 0;
                      //add current point to the backtracker
                      SDL_Point newPoint = { point->x, point->y };
                      backtracker.push(newPoint);
                      //move the current point
                      point->x -= 2;
                      mazeGenHelper(maze, height, width, backtracker, point,endPoint);
                  }
        }
        }
    }
    if (backtracker.size() != 0)
    {
        //pop curent element off the stack and recall
        SDL_Point newPoint = backtracker.top();
        endPoint->x = newPoint.x;
        endPoint->x = newPoint.y;
        backtracker.pop();
        mazeGenHelper(maze, height, width, backtracker, &newPoint,endPoint);
    }
    // else the maze must be done
}

И вот я пытаюсь получить к нему доступ

void sdlapp::render()
{
    //clear the screen
    SDL_RenderClear(m_renderer);
    //do render stuff here

    //rect area for 
    SDL_Rect rect = { 0,0, zoomLevel, zoomLevel };

    //render the maze walls
    for (int i = 0; i < WIDTH;i++)
    for (int k = 0; k < HEIGHT; k++)
    {
        switch (maze[i][k])//<- thats where i am trying to access it.
        {
        case 1: // theres a wall
        {
                    rect.x = i * zoomLevel-camera->x;
                    rect.y = k * zoomLevel-camera->y;
                    SDL_RenderCopy(m_renderer, mazeWallTex, NULL, &rect);
        }
            break;
        case 2: //theres a start point
        {
                    rect.x = i * zoomLevel - camera->x;
                    rect.y = k * zoomLevel - camera->y;
                    SDL_RenderCopy(m_renderer, mazeStartTex, NULL, &rect);
        }
        case 3:
        {
                  rect.x = i * zoomLevel - camera->x;
                  rect.y = k * zoomLevel - camera->y;
                  SDL_RenderCopy(m_renderer, mazeEndTex, NULL, &rect);
        }
        }

    }
    //update the screen to the current render
    SDL_RenderPresent(m_renderer);
}

Я не ожидаю, что вы прочитаете весь этот код, но я все равно разместил его. Если кто-то знает, что я делаю неправильно, не могли бы вы указать мне правильное направление?

Спасибо за ваше время JustinWeq, кстати, я не очень хочу использовать векторы и могу правильно определить местоположение моей памяти без каких-либо утечек памяти.

1 ответ

Поскольку это решило проблему, я скопирую свой комментарий здесь в качестве ответа (чтобы немного улучшить список без ответа):

Я не читал весь код, но первое, что выделяется, это: вы передаете int**** mazes в mazeGen, но первое, что делает функция, это отбрасывает переданное значение и заменяет его новым выделением.

Если вы хотите, чтобы эти выделения были видны для вызывающего абонента (что, я полагаю, вы делаете; в том виде, в каком оно есть, эта память просто протекает), вам нужно использовать int**** &maze, (И я все еще думаю, что вам было бы лучше без сырых указателей, но это не codereview.SE.)

Другие вопросы по тегам