为这个二进制节点类创建析构函数的正确方法是什么?

时间:2014-11-15 10:45:23

标签: c++ tree binary-tree destructor

class node{

private:
node* parent;
node* leftchild;
node* rightchild;
// etc.... 
}

我不想用析构函数创建一个无限循环,这就是为什么我感兴趣的如何为它做一个好的构造函数。

2 个答案:

答案 0 :(得分:0)

delete的指针上调用NULL将不会调用析构函数 只需在构造函数中将节点设置为NULL,并且只有在它们存在时才分配它们。

因此可以安全地删除析构函数中的子对象,导致'链''当它到达NULL的子节点时将停止。

示例:

#include <iostream>

class Node{
public:
  Node() {
    node = NULL;
  }
  ~Node() {
    std::cout << "Deleting" << std::endl;
    delete node;
  }
  void CreateChildNode() {
    node = new Node();
  }
private:
  Node* node;
};

int main()
{
  Node *n = new Node();
  n->CreateChildNode();
  delete n;
  return 0;
}

上面的代码片段将输出:
删除
正在删除

答案 1 :(得分:0)

我会说:

node::~node()
{
    // remove reference to this from neighboor.
    if (leftchild) {
        leftchild->parent = nullptr;
    }
    if (rightchild) {
        rightchild->parent = nullptr;
    }
    if (parent) {
        if (parent->leftchild == this) {
            parent->leftchild = nullptr;
        } else {
            parent->rightchild = nullptr;
        }
    }
}

std::shared_ptr /(std::weak_ptrstd::unique_ptr)的正确smartPointer(parent / leftchild或指针/ rightchild)。< / p>