2015-07-11 192 views
-3

我开始编写一个二叉树,然后提出这个例子,我不知道发生了什么。因此,这里的代码:C++对象指针范围

#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

未定义的行为是_undefined_。 –

+0

我投票结束这个问题作为题外话,因为要求未定义行为的实际_workings_是没用的。 –

+0

我不知道这是未定义的行为,因为它编译在我的电脑上。 – user3199819

回答

0

可能是内存属于你的程序,并且没有什么不好似乎会发生,因为你使用的内存很小。如果你使用更多的内存,一些对象将拥有未分配的空间,并期望它保持不变。那么这段代码就会开始给你提供问题。

你是“解除引用未初始化的指针”。例如,有关于这个herehere的问题。如果你这样做,你的编译器可能会炸毁,或者它可能不会:行为是未定义的。任何事情都可能发生,包括外观事情正在工作。

使用new,就像你应该。

0

该代码无效。在此功能下

void Add(int k) 
{ 
    Node* t; 
    t->key = k; 
    root->left = t; 
} 

本地变量t未初始化且具有不确定的值。所以执行声明

t->key = k; 

导致未定义的行为。

您正确指出,必须使用新的操作符。例如

Node* t = new Node(k); 

然而即使在这种情况下,函数是无效的,因为它必须检查新的密钥是否小于比根的关键更大。根据条件应该有任一

root->left = t; 

root->right = t; 
0

此线&hellip;

Node* t; 

&hellip;是这样的:

Node* t = random_address; 

这意味着下一行......

t->key = k; 

&hellip;能够破坏有趣的记忆位置。