我正在使用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
答案 0 :(得分:1)
首先,这条线是没用的:
Node * root_ptr = new Node;
您立即将root_ptr重新分配给其他人。所以这条线除了分配内存外什么都不做。然后按如下方式分配root_ptr:
&(t.nodes[root_index]);
您在堆栈上声明的变量t。你最终得到一个指向vector元素的指针,这是你自己从未分配过的元素。如果您没有自己分配,则无法删除它。向量的任何分配都将由向量处理,向量本身是堆栈分配的,因此您无法删除它。
这就是删除行崩溃的原因。
此外,您说这是一个简单的二叉树实现,但事实并非如此。你有一个向量,你有一种奇怪的方式来分配树元素,所以你已经创建了某种混合数据结构。