对于我目前的学习练习,我正在研究链表和树木.我最近看到一个建议是通过让每个节点删除其子/子来递归地销毁数据结构.然而,在我发现的几乎所有示例中,节点析构函数都是空的,而某些管理类使用某种形式的迭代和删除来处理破坏.从可靠性和/或风格的角度来看,递归析构函数有什么本质上的坏处吗?
以下是我对这两种方法的理解的实现.
递归破坏:
#include <iostream>
struct Node {
static int count;
Node() : num_(count++), p_next_(0) {}
~Node() {
std::cout << "entering " << num_ << "\n";
delete p_next_;
std::cout << " leaving " << num_ << "\n";
}
const int num_;
Node* p_next_;
};
int Node::count = 0;
int main () {
Node* p_head = new Node();
p_head->p_next_ = new Node();
p_head->p_next_->p_next_ = new Node();
delete p_head;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我对处理破坏的管理类的看法.假设我为Node定义了以下DTOR:
~Node() {std::cout << "Someone deleted " << num_ << …Run Code Online (Sandbox Code Playgroud) 我在使用extern的翻译单元中删除了两个标题包含.这是可取的吗?
我的具体情况:我有一个叫ParseTree累积的类Token*. ParseTree*是的私人成员Parser.
最初,我有以下几行parse_tree.cc.
#include "parser.h"
#include "token.h"
Run Code Online (Sandbox Code Playgroud)
在分析了我的代码之后,我将实际具有外部依赖关系的两个函数隔离开来,并用以下内容替换了包含:
extern std::ostream& operator<<(std::ostream& out, const Token& t); // @token.h
extern bool hasPriority(const Token* p_tok1, Token* p_tok2); // @parser.h
Run Code Online (Sandbox Code Playgroud)
两种解决方案似乎都有效.选择extern over include时,我应该注意哪些隐藏的危险?