У меня проблема с деструктором. У меня есть два класса: 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
, он не будет удален, если он уже есть. Но это не помогает.
У меня есть исключение, которое выдается вот так:
И из режима отладчика у меня это: - первая итерация
- вторая итерация
Во время анализа из режима отладчика я начал думать, что деструктор точного Tile
удаляет первого родителя Tile
, а затем самого себя. И после этого он переходит к линии parent = nullptr
внутри деструктора Tile
. Но почему-то только ребенок Tile
устанавливается на nullptr
.