Как удалить ссылку на объект - PullRequest
0 голосов
/ 22 июня 2019

В настоящее время я создаю небольшую игру в жанре roguelike на C ++.В своем коде я решил изобразить пол подземелья, используя сетку ячеек.

#include <array>
const int MAX_H = 40;
const int MAX_W = 70;
class Grid{
private:
std::array<std::array<Cell *,MAX_H>,MAX_W> m_cells;
public:
Grid();
~Grid();
void resetGrid();
void placeCharacter(Character * character, int x, int y);
void placeItem(Item * item, int  x, int y);
void placeTile(Tile * tile, int x, int y);
};

Конструктор сетки:

 Grid::Grid(){
      for(int i = 0; i<MAX_H; i++)
      {
       for(int j = 0; j<MAX_W; j++)
       {
        m_cells[i][j]=new Cell(i,j);
       }
      }
    }

Ячейка представлена ​​следующим образом:

  class Cell{
private:
Cell() = default;
    Character* m_character=nullptr;
    Item* m_item=nulltpr;
    Tile* m_tile=nullptr; 
    int x;
    int y;
public:
bool setCharacter(Character *);
bool setItem(Item *item);
bool setTile(Tile *tile);
Character *getCharacter();
Item * getItem();
Tile *getTile();
    };

Каждый экземпляр Cell может содержать экземпляр Item, экземпляр Character или экземпляр Tile.В моем main.cpp я использую следующие инструкции:

Grid g;
Item * spear = new Item();
Tile * trap = new Tile();
g->placeItem(spear,5,5);
g->placeTile(trap,4,5);

Когда я меняю пол, мне нужно было удалить все элементы и элементы мозаики в сетке.Таким образом, эта функция была моим первым решением:

void Grid::resetGrid()
{
for (int i = 0; i < MAX_W + 1; i++)
    {
        for (int j = 0; j < MAX_H + 1; j++)
        {

            Cell * cell = m_grid[i][j];
            if(cell->getItem()!=nullptr)
            {
                delete cell->getItem();
            }
            if(cell->getTile()!=nullptr)
            {
                delete cell->getTile();
            }                

        }
    }

Это принесло мне ошибку двойного свободного или недопустимого указателя при методе resetGrid ().Я понимаю, что это может происходить из-за того, что «копье» и «ловушка» создаются особым образом, но мне не хватает хорошего освещения для указателей c ++ с объектом.Если у кого-то есть идея, пожалуйста, не стесняйтесь опубликовать ответ.

РЕДАКТИРОВАТЬ Как указали пользователи, я забыл установить свой элемент и плитку на nullptr после удаления.Я понимаю, что хотя я использую указатель, а не умный указатель, такой как std::unique_ptr или std::shared_ptr, я забыл убедиться, что эти указатели должны указывать на nullptr после удаления

...