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
语句之后,如果它已经被删除,则不会被删除。但这没用

我遇到了这样的异常:

在调试器模式下,我有: -第一次迭代

  • 第二次迭代

在调试器模式的分析过程中,我开始认为exact
Tile
的析构函数删除第一个父级
Tile
,而不是他自己。然后,它跳转到
Tile
析构函数中的
parent=nullptr
行。但不知何故,只有子
磁贴
被设置为
nullptr

什么是所有权关系?每个
磁贴
是否只有一个
地图
?为什么
磁贴
在移动时会删除其父级?您需要确定
磁贴
是否负责管理其父级的内存(可能不是),或者
映射
是否负责管理其
磁贴
的内存(可能)。只有负责该资源的类才应该删除它。将行反转,
=nullptr,然后删除work@TheGridLock这将导致内存泄漏,因为要删除的对象可能会被遗忘<代码>删除空PTR无效。Omg@Ted lynmo。我以前遇到过这个错误,我已经这样做了。结果证明这是一个大错误