繁体   English   中英

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 存储位置,依此类推。 我知道可能的智能指针可以帮助我,但我认为首先学习如何以更难的方式做到这一点对我有好处。 我认为问题在于(我不知道为什么)在删除带有 Tiles 的 Map vector 时,我不仅删除了确切的 Tile,而且还以某种方式删除了该 Tile 的父级 Tile? 而 fe 在下一次迭代中应该删除前一次迭代的父级时它不能,因为它已经被删除了。 我认为在 Tile 析构函数中的 if 语句之后,如果它已经是,它就不会被延迟。 但它没有帮助。

我有这样的异常抛出:
在此处输入图片说明

从调试器模式我有这个:

  • 第一次迭代
    在此处输入图片说明

  • 第二次迭代
    在此处输入图片说明

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

问题很可能是 parent 不是拥有指针,所以它不应该删除 parent。

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

否则当 Map 删除 tile 时,它​​已经被删除了。 删除这部分代码应该可以解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM