У меня проблема с деструктором. У меня есть два класса: карта и плитка. Они выглядят так: (если приведенных ниже фрагментов кода недостаточно, я добавляю 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](https://i.stack.imgur.com/Zt4R7.png)
А из режима отладки у меня это:
-
первая итерация
![enter image description here](https://i.stack.imgur.com/jHZpF.png)
вторая итерация
![enter image description here](https://i.stack.imgur.com/XlkNm.png)
Во время анализа из режима отладчика я начал думать, что деструктор точного тайла удаляет сначала родительский тайл, а потом его самого. И после этого он переходит на строку parent = nullptr внутри деструктора Tile. Но почему-то только дочерний Tile устанавливается на nullptr.