2015-07-11 236 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;能夠破壞有趣的記憶位置。