小编Jor*_*ray的帖子

链表,树等的递归析构函数是不是很糟糕?

对于我目前的学习练习,我正在研究链表和树木.我最近看到一个建议是通过让每个节点删除其子/子来递归地销毁数据结构.然而,在我发现的几乎所有示例中,节点析构函数都是空的,而某些管理类使用某种形式的迭代和删除来处理破坏.从可靠性和/或风格的角度来看,递归析构函数有什么本质上的坏处吗?

以下是我对这两种方法的理解的实现.

递归破坏:

#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)

c++ recursion destructor coding-style

8
推荐指数
1
解决办法
3335
查看次数

是否建议使用extern来避免头依赖?

我在使用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时,我应该注意哪些隐藏的危险?

c++ coding-style include extern

3
推荐指数
1
解决办法
846
查看次数

标签 统计

c++ ×2

coding-style ×2

destructor ×1

extern ×1

include ×1

recursion ×1