C ++对象指针范围

时间:2015-07-11 17:43:38

标签: c++ pointers

我开始编写一个二叉树,然后想出了这个例子,我不知道发生了什么。所以这是代码:

#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关键字,在我看来无论如何都有在堆中分配的内存,因为我可以到达该对象。不应该超出范围并被销毁?为什么我能够达到那个目标并打印出它的钥匙?

3 个答案:

答案 0 :(得分:0)

可能内存属于你的程序,似乎没有什么坏事,因为你使用的内存很少。如果您使用更多内存,某些对象将拥有该未分配的空间并期望它保持不变。然后这段代码就会开始给你带来麻烦。

您正在“取消引用未经授权的指针”。例如,有关于此herehere的问题。如果您这样做,您的编译器可能会爆炸,或者它可能不会:行为未定义。任何事情都可能发生,包括事情正在发挥作用的外观

使用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;

...能够破坏有趣的记忆位置。