c ++ pathfinder - 带指针的对象向量

c++ pathfinder - vector of objects with pointers

我的析构函数有问题。我有两个 类:Map 和 Tile。他们看起来像这样: (如果下面的代码片段不够用,我将在这个项目中添加 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;
    }
}

代码用于最短路径搜索算法。我必须存储以前的 Tile 所以当算法找到完成时它可以向后搜索最短路径。如果需要,我可以添加更多代码。总结一下:Map 对象具有 Tiles 向量。每个 Tile 首先没有指向任何东西。但如果它被算法使用,而不是前一个的确切 Tile 存储位置,依此类推。我知道 propably 智能指针可以帮助我,但我虽然首先学习如何做这可能对我有好处可能更难。 我认为问题在于(我不知道为什么)在使用 Tiles 删除 Map 向量时,我不仅删除了确切的 Tile,而且还以某种方式删除了作为该 Tile 父级的 Tile?和 f.e。在下一次迭代中,当它应该删除上一次迭代的那个父级时,它不能,因为它已经被删除了。我认为在 Tile 析构函数中的 if 语句之后,如果它已经被删除,它就不会被删除。但这没有帮助。

我遇到了这样的异常:

从调试器模式我有这个:

在调试器模式下的分析过程中,我开始认为确切图块的析构函数首先删除父图块,而不是他自己。然后它跳转到 Tile 析构函数中的 parent = nullptr 行。但是不知何故,只有子 Tile 被设置为 nullptr。

问题很可能是父级不是拥有指针,因此不应删除父级。

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

否则地图删除瓦片时,瓦片已经被删除了。删除这部分代码应该可以解决问题。