【问题标题】:C++ object pointer scopeC++ 对象指针范围
【发布时间】:2015-09-30 08:07:08
【问题描述】:

我开始编写二叉树,然后想出了这个例子,但我不确定发生了什么。代码如下:

#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;
}

Add 函数 Add in Tree 让我很困惑。因此,有一个指向 Node 对象的指针,但没有使用 new 关键字,在我看来,无论如何在堆中分配了内存,因为我可以访问该对象。不应该超出范围并被销毁吗?为什么我可以到达那个物体并打印出它的钥匙?

【问题讨论】:

  • 未定义的行为,嗯未定义
  • 我投票决定将此问题作为题外话结束,因为询问未定义行为的实际 工作原理 是没有用的。
  • 我不知道这是未定义的行为,因为它在我的计算机上编译。

标签: c++ pointers


【解决方案1】:

可能内存属于您的程序,并且似乎没有发生任何不好的事情,因为您使用的内存太少了。如果您使用更多内存,则某些对象将拥有该未分配空间并期望它保持不变。那么这段代码就会开始给你带来问题。

您正在“取消引用未初始化的指针”。例如,与 herehere 有关的问题。如果您这样做,您的编译器可能会崩溃,也可能不会:行为未定义。任何事情都可能发生,包括外观事情正在发挥作用。

使用new,就像你应该的那样。

【讨论】:

    【解决方案2】:

    这一行……​​

    Node* t;
    

    ……就像:

    Node* t = random_address;
    

    表示下一行……

    t->key = k;
    

    …能够破坏有趣的内存位置。

    【讨论】:

      【解决方案3】:

      代码无效。在这个函数中

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        相关资源
        最近更新 更多