这个 - > m_xy是一个nullptr

时间:2016-05-03 19:54:47

标签: c++ nullptr

所以作为我的第一个c ++程序,我想制作一个小二叉树,但是在输入根后的第一个值之后:

抛出异常:写入访问冲突。

this-> m_left是nullptr。

我的测试输入:减少int数。

我的代码:

#include<iostream>

class BinaryTree
{
public:
    BinaryTree *m_left;
    int m_key;
    BinaryTree *m_right;

    void insert(int value)
    {
        BinaryTree son;

        if (value <= m_key)
        {
            if (m_left == NULL)
                *m_left = { NULL, value, NULL };  //Error
            else
            (*m_left).insert(value);
        }
        //uniportant stuff ...
     }

     //unimportant stuff
};

int main()
{
int rootValue(0);
std::cout << "Enter a value for the root: ";
std::cin >> rootValue;
std::cout<<std::endl;

BinaryTree root = { NULL, rootValue, NULL };

int leafValue(1);
std::cout << "Enter a value for the leaf or enter 0 to finish: ";
std::cin >> rootValue;
while (leafValue != 0)
{
    root.insert(leafValue);
    std::cout << "Enter a value for the leaf or enter 0 to finish: ";
    std::cin >> rootValue;
    std::cout << std::endl;
}

root.print();

return 0;

}

2 个答案:

答案 0 :(得分:3)

创建root节点时,您将创建一个本地BinaryTree对象。

当您在以下分支中插入第一个值m_leftNULL时:

if (m_left == NULL)
   *m_left = { NULL, value, NULL };  // Assignment to a NULL pointer.

会发生什么?您取消引用空指针以复制对象。此时行为未定义且注定要失败。

在为取消引用的指针* m_left分配任何内容之前,指针必须指向有效的对象。

您可以按如下方式更正作业:

  m_left = new BinaryTree{ NULL, value, NULL };

答案 1 :(得分:1)

好的,问题解决了。简单地改变了

       *m_left = { NULL, value, NULL };

        m_right = new BinaryTree;
        (*m_right).m_left = NULL;
        (*m_right).m_key = value;
        (*m_right).m_right = NULL;

thx Niall