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;
}
}
否则地图删除瓦片时,瓦片已经被删除了。删除这部分代码应该可以解决问题。
我的析构函数有问题。我有两个 类: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;
}
}
否则地图删除瓦片时,瓦片已经被删除了。删除这部分代码应该可以解决问题。