c ++ вектор объектов с указателем деструктора - PullRequest
0 голосов
/ 15 марта 2020

У меня проблема с деструктором. У меня есть два класса: Map и Tile. Они выглядят так:

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;
    }
}

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

Я думаю, что проблема в том (я точно не знаю, почему) при удалении вектора Map с Tiles я не только удаляю точный Tile, но и каким-то образом Tile, который является родителем этого Tile? И, например, на следующей итерации, когда он должен удалить родителя предыдущей итерации, он не может этого сделать, потому что он уже удален.

Я думал, что после оператора if внутри деструктора Tile , он не будет удален, если он уже есть. Но это не помогает.

У меня есть исключение, которое выдается вот так:
enter image description here

И из режима отладчика у меня это: - первая итерация enter image description here

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

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

...