gpt4 book ai didi

c++ - 析构函数、图和递归

转载 作者:行者123 更新时间:2023-11-28 02:28:07 25 4
gpt4 key购买 nike

我有一个图形对象,我想为此创建一个析构函数。但是,我对递归性并不是很满意,而且我对自己的数据结构有点迷茫。我将展示所涉及的类和我的析构函数的开头。

class Graph {

private :
Graph* parent;
vector<Graph> child;
Board tab;
bool seen;

public :
Graph(const Board&);
Graph(const Board&, Graph*);
~Graph();
...
};

class Board {
private :
int** tab;
int nbline;
int nbcolumn;
Position emptyspot;

public :
Board();
Board(int, int, Play&);
Board(int, int);
Board(const Board&);
Board(int, int, ifstream&);
~Board();
...
};

位置类只有 2 个整数(行和列)。Board 析构函数的工作原理:

Board::~Board()
{
for(int i = 0; i < this->nbline; i++) {
delete tab[i];
}
delete tab;
}

如您所料,我想销毁我的图中的一个节点,以及所有后续节点。

这是我的开始:

Graph::~Graph() {        
while(!child.empty()) {
for(vector<Graph>::iterator itr = child.begin; itr != child.end; ++itr) {
delete child[itr];
}
}
}

这样我就可以递归地进入我的所有分支,对吧?当我找到一片叶子( vector 为空)时 - 如果销毁所有内容,父 vector 中会发生什么?

我不知道parent会不会把自己置为NULL(我不这么认为),parent vector内存空间不会被unallocated所以条件child.empty()不会满足,对吧?

  • 如何以及何时销毁 *Graph ?

  • 我有堆栈溢出的风险吗?

    • 我可以在我开始删除的根节点中调用 vector.erase() 来递归销毁所有内容而不是执行 for 循环吗?

最佳答案

由于很多原因,您的析构函数不正确。

  1. 你的 child成员可能应该是vector<Graph*>这样你就可以delete他们。
  2. 如果你的 Graph 你的循环是无限的有任何 child ,因为您永远不会更改 child大小 vector 。
  3. child[itr]不是你如何获得 Graph*对应迭代器,*itr是。
  4. beginend是成员函数,所以需要调用。
  5. 成员的名字可能应该是children , 不是吗?

正确的循环是:

for (vector<Graph*>::iterator itr = children.begin(); itr != children.end(); ++itr) {
delete *itr; // this will recursively call Graph::~Graph()
// on the children, and then free their memory
}

或者,在 C++11 中,我们简单地定义:

std::vector<std::unique_ptr<Graph>> children;

以便为我们处理内存清理。

关于c++ - 析构函数、图和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29822657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com