C++ c++;带指针析构函数的对象向量
我的析构函数有问题。我有两个类:C++ c++;带指针析构函数的对象向量,c++,pointers,vector,destructor,C++,Pointers,Vector,Destructor,我的析构函数有问题。我有两个类: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(); ... } Tile::~Tile() {
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();
...
}
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;
}
}
及
类映射
{
私人:
矢量板;
...
公众:
映射(sf::Vector2i numberOfTiles={10,10},sf::Vector2f sizeOfTiles={
50.f,50.f});
地图(常数地图和cMap);
映射和运算符=(常量映射和aMap);
~Map();
...
}
它们的析构函数如下所示:
class Tile
{
private:
Tile* parent;
...
public:
Tile(sf::Vector2f size = { 50.f ,50.f });
Tile(const Tile& cTile);
Tile& operator=(const Tile& aTile);
~Tile();
...
}
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::~Tile()
{
if(父级!=nullptr)
{
删除父项;
父项=nullptr;
}
}
地图::~Map()
{
对于(int i=0;i
代码用于最短路径搜索算法。我必须存储以前的平铺
,这样当算法找到finish时,它可以向后搜索最短路径。如果需要,我可以添加更多的代码。总而言之:Map
对象有一个向量Tiles
,每个Tile
最初都不指向任何东西。但是,如果算法使用它,那么这个精确的平铺存储上一个平铺的位置,依此类推。我知道智能指针可能会对我有所帮助,但我认为首先学习如何使用可能更难的方法对我来说是件好事
我认为问题在于(我不知道确切原因)在删除带有Tile
的Map
向量时,我不仅删除了确切的Tile
,而且不知何故也删除了Tile
的父对象Tile
?例如,在下一次迭代中,当它应该删除上一次迭代的父级时,它不能删除,因为它已经被删除了
我认为,在Tile
析构函数中的if
语句之后,如果它已经被删除,则不会被删除。但这没用
我遇到了这样的异常:
在调试器模式下,我有:
-第一次迭代
- 第二次迭代
在调试器模式的分析过程中,我开始认为exactTile
的析构函数删除第一个父级Tile
,而不是他自己。然后,它跳转到Tile
析构函数中的parent=nullptr
行。但不知何故,只有子磁贴
被设置为nullptr
什么是所有权关系?每个磁贴
是否只有一个地图
?为什么磁贴
在移动时会删除其父级?您需要确定磁贴
是否负责管理其父级的内存(可能不是),或者映射
是否负责管理其磁贴
的内存(可能)。只有负责该资源的类才应该删除它。将行反转,=nullptr,然后删除work@TheGridLock这将导致内存泄漏,因为要删除的对象可能会被遗忘<代码>删除空PTR代码>无效。Omg@Ted lynmo。我以前遇到过这个错误,我已经这样做了。结果证明这是一个大错误