单链表 - C ++ - 无法解释的运行时错误

时间:2013-10-28 06:28:51

标签: c++ constructor linked-list

我编写了以下代码,只是在C ++中创建并将节点(整数数据)插入到SLL中。

#include <stdio.h>

class Node
{
    public:
        int data;
        Node * next;
        Node * first;
        Node() {}

        void insert(int dat)
        {
            Node * newnode = new Node();
            newnode->data=dat;
            newnode->next=NULL;
            if(first==NULL)
            {
                first=newnode;
            }
            else
            {
                Node *temp=first;
                while(temp->next!=NULL)
                { temp=temp->next; }
                temp->next=newnode;
            }
        }
};

int main()    
{
    Node * a=new Node();
    a->insert(12);
    return 0;
}

首先,我尝试将Node构造函数重写为Node(int dat),并尝试对我在insert中创建的每个新节点(data = dat,next = NULL)进行初始化。将使用main中的“dat”值调用Insert,它将调用重载的Node构造函数将数据初始化为dat,并将数据初始化为NULL。这导致我的程序崩溃。

所以我取出了默认和重载的构造函数,并对插入本身中的每个新元素进行了初始化。我的程序运行正常。但是,即使添加默认构造函数(如代码的第10行所示),我的程序也会崩溃。谁能告诉我为什么在这两种情况下都会发生这种情况?

感谢。

3 个答案:

答案 0 :(得分:1)

您的默认构造函数使数据成员未初始化。所以这一行:

Node * a=new Node();

使用未初始化的成员创建节点,在尝试添加节点时会导致问题。当你删除你的默认构造函数时,上面一行(由于new Node()中的parenteses与该类没有用户定义的构造函数的事实相结合)导致所有成员的value initialization,所以指针获取初始化为NULL,并获得预期的行为。

如果您遗漏了括号:

Node * a = new Node;

数据成员将是未初始化的,就像你没有做任何默认构造函数一样。

正确的解决方案是修复默认构造函数以显式初始化所有成员。

Node() :data(0), next(nullptr), first(nullptr) {}

答案 1 :(得分:0)

Node * a=new Node();

创建一个新节点,运行其默认构造函数......

Node() {}

...效果不佳 - 甚至没有初始化datanextfirst

因此,当你打电话......

a->insert(12);

......它尝试......

if(first==NULL)

...它从未初始化的内存中读取,导致未定义的行为。在一次运行中,新创建的对象可能碰巧在那里有一个0,另一次可能没有,有些时候它可能只是崩溃尝试读取值。你继续用未初始化的数据做更糟糕的事情。

更一般地说,当你遇到这样的问题时,我建议你放入std::cerr << xyz << '\n';语句来转储一些相关变量,或者在调试器中追踪 - 你可能已经看到变量有垃圾值,那么可能有开始研究为什么,这可能在这里产生了一个更集中的问题,或者可能引导你找到现有的答案......

答案 2 :(得分:0)

在构造函数中初始化成员变量,如下所示

Node() {
             data =0;
             first = NULL;
             next = NULL;
}