c++对象指针作用域

C++ object pointer scope

本文关键字:作用域 指针 对象 c++      更新时间:2023-10-16

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

#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关键字,而且在我看来,无论如何,堆中分配了内存,因为我可以到达对象。不应该走出范围被摧毁吗?为什么我可以拿到那个对象并打印出它的密钥?

可能内存属于您的程序,并且似乎没有什么不好的事情发生,因为您使用的内存很少。如果您使用了更多的内存,某些对象将拥有未分配的空间,并期望它保持不被修改。然后这段代码就会开始给你出问题。

你正在"解引用一个未初始化的指针"。例如,这里和这里都有与此相关的问题。如果这样做,编译器可能会崩溃,也可能不会:行为是未定义的。任何事情都可能发生,包括看起来事情正在工作。

应该使用new

这一行& help;

Node* t;

白马王子;就像:

Node* t = random_address;

表示下一行& help;

t->key = k;

白马王子;

代码无效。在这个函数

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

局部变量t未初始化且值不确定。语句

的执行
    t->key = k;

导致未定义的行为。

您正确地指出必须使用operator new。例如

Node* t = new Node( k );

然而,即使在这种情况下,函数也是无效的,因为它必须检查新键是小于还是大于根键。根据条件,应该有

root->left = t;

root->right = t;