我开始编写一个二叉树,然后想出了这个例子,我不知道发生了什么。所以这是代码:
#include<iostream>
using namespace std;
struct Node
{
Node *left, *right;
int key;
Node()
{
left = NULL;
right = NULL;
key = 0;
}
Node(int key)
{
left = NULL;
right = NULL;
key = key;
}
};
struct Tree
{
Node* root;
void Add(int k)
{
Node* t;
t->key = k;
root->left = t;
}
Tree(int key)
{
this->root = new Node(key);
}
};
int main()
{
Tree* tree = new Tree(5);
tree->Add(4);
cout<<tree->root->left->key;
return 0;
}
添加功能在树中添加是什么让我感到困惑。所以,有一个指向Node对象的指针,但是没有使用new关键字,在我看来无论如何都有在堆中分配的内存,因为我可以到达该对象。不应该超出范围并被销毁?为什么我能够达到那个目标并打印出它的钥匙?
答案 0 :(得分:0)
可能内存属于你的程序,似乎没有什么坏事,因为你使用的内存很少。如果您使用更多内存,某些对象将拥有该未分配的空间并期望它保持不变。然后这段代码就会开始给你带来麻烦。
您正在“取消引用未经授权的指针”。例如,有关于此here和here的问题。如果您这样做,您的编译器可能会爆炸,或者它可能不会:行为未定义。任何事情都可能发生,包括事情正在发挥作用的外观。
使用new
,就像你应该的那样。
答案 1 :(得分:0)
代码无效。在这个功能
void Add(int k)
{
Node* t;
t->key = k;
root->left = t;
}
局部变量t
未初始化且具有不确定的值。所以执行语句
t->key = k;
导致未定义的行为。
您正确地指出必须使用operator new。例如
Node* t = new Node( k );
尽管如此,即使在这种情况下,该函数也是无效的,因为它必须检查新密钥是否小于root的密钥。根据情况,应该有
root->left = t;
或
root->right = t;
答案 2 :(得分:0)
这一行...
Node* t;
...就像:
Node* t = random_address;
这意味着下一行...
t->key = k;
...能够破坏有趣的记忆位置。