C ++二叉树实现 - 删除指针原因

时间:2018-01-21 01:22:45

标签: c++ pointers error-handling tree

我正在使用C ++编写一个非常基本的二叉树实现,但我目前遇到的问题是删除指向根节点的指针会导致程序崩溃。在Dev-C ++调试模式中,返回的错误是:"程序接收信号SIGTRAP,跟踪/断点陷阱",但当我用" info breakpoints"检查时,它表示没有断点或观察点。我对此很困惑,并且花了很多时间检查我是否正确使用并声明了所有指针,任何帮助都会非常感激!

#include <iostream>
#include <vector>

using namespace std;


class Node {
  public: 
    int key;
    Node * left_child = NULL;
    Node * right_child = NULL;  
};


class Tree {

  public:

      int num_nodes;
      vector<Node> nodes;

   int read() {

    cin >> num_nodes;   
    nodes.resize(num_nodes); 
    int input_key, input_left, input_right, root_node = 0;

    for (int i = 0; i < num_nodes; i++) {

      cin >> input_key >> input_left >> input_right;
      if(input_key >= nodes.size()) {
        nodes.resize(input_key+1);
      }
      if(i==0) {
        root_node = input_key;
      }


      nodes[input_key].key = input_key;
      if(input_left >= 0) {
        nodes[input_key].left_child = &nodes[input_left];   
      } 

      if(input_right >= 0) {
        nodes[input_key].right_child = &nodes[input_right]; 
      }
    }
    return root_node;
  }
};


int main() {

    Tree t;
    int root_index = 0;
    root_index = t.read();

    Node * root_ptr = new Node;
    root_ptr = &(t.nodes[root_index]);
    delete root_ptr; //when I take this line out, it works

}

示例输入(无预期输出):

3
4 2 5
2 -1 -1
2 -1 -1

1 个答案:

答案 0 :(得分:1)

首先,这条线是没用的:

Node * root_ptr = new Node;

您立即将root_ptr重新分配给其他人。所以这条线除了分配内存外什么都不做。然后按如下方式分配root_ptr:

 &(t.nodes[root_index]);

您在堆栈上声明的变量t。你最终得到一个指向vector元素的指针,这是你自己从未分配过的元素。如果您没有自己分配,则无法删除它。向量的任何分配都将由向量处理,向量本身是堆栈分配的,因此您无法删除它。

这就是删除行崩溃的原因。

此外,您说这是一个简单的二叉树实现,但事实并非如此。你有一个向量,你有一种奇怪的方式来分配树元素,所以你已经创建了某种混合数据结构。