c ++ pathfinder - вектор объектов с указателями - PullRequest
0 голосов
/ 16 марта 2020

У меня проблема с деструктором. У меня есть два класса: карта и плитка. Они выглядят так: (если приведенных ниже фрагментов кода недостаточно, я добавляю github с этим проектом с полным кодом внутри: https://github.com/TMalicki/PathFinder-algorithms)

class Tile
{
  private:
  Tile* parent;
  ...
  public:
  Tile(sf::Vector2f size = { 50.f ,50.f });
  Tile(const Tile& cTile);
  Tile& operator=(const Tile& aTile);
  ~Tile();
  ...
}

и

class Map
{
private:
vector<Tile*> board;
...
public:   
Map(sf::Vector2i numberOfTiles = { 10, 10 }, sf::Vector2f sizeOfTiles = { 
50.f, 50.f });
Map(const Map& cMap);
Map& operator=(const Map& aMap);
~Map();
...
}

Их деструкторы выглядят так:

Tile::~Tile()
{
    if (parent != nullptr)
    {
        delete parent;
        parent = nullptr;
    }
}

Map::~Map()
{
    for (int i = 0; i < board.size(); i++)
    {
        delete board[i];
        board[i] = nullptr;
    }
}

Код используется для алгоритма поиска кратчайшего пути. Я должен сохранить предыдущую плитку, чтобы, когда алгоритм нашел fini sh, он мог искать кратчайший путь назад. Я могу добавить еще немного кода, если это необходимо. Подводя итог: у объекта карты есть вектор плиток. И каждая плитка в первую очередь ничего не указывает. Но если он используется по алгоритму, чем эта точная позиция хранения Tile предыдущего и т. Д. В начале. Я знаю, что умные указатели могут мне помочь, но мне было бы полезно, во-первых, научиться делать это, возможно, более сложным способом. Я думаю, что проблема заключается в том, что (я точно не знаю, почему), удаляя вектор карты с помощью плиток, я не только удаляю точную плитку, но и каким-то образом плитку, которая является родительской для этой плитки? И, например, в следующей итерации, когда он должен удалить родителя предыдущей итерации, он не может этого сделать, потому что он уже удален. Я подумал, что после оператора if внутри деструктора Tile он не будет удален, если он уже есть. Но это не помогает.

У меня возникло исключение:
enter image description here

А из режима отладки у меня это:

  • первая итерация
    enter image description here

  • вторая итерация
    enter image description here

Во время анализа из режима отладчика я начал думать, что деструктор точного тайла удаляет сначала родительский тайл, а потом его самого. И после этого он переходит на строку parent = nullptr внутри деструктора Tile. Но почему-то только дочерний Tile устанавливается на nullptr.

1 Ответ

0 голосов
/ 16 марта 2020

Возможно, проблема в том, что родительский объект не является указателем-владельцем, поэтому он не должен удалять родительский элемент.

Tile::~Tile() {
    if (parent != nullptr) {
        delete parent; <----------- here
        parent = nullptr;
    }
}

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

...