我编写了以下代码,只是在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行所示),我的程序也会崩溃。谁能告诉我为什么在这两种情况下都会发生这种情况?
感谢。
答案 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() {}
...效果不佳 - 甚至没有初始化data
,next
或first
。
因此,当你打电话......
a->insert(12);
......它尝试......
if(first==NULL)
...它从未初始化的内存中读取,导致未定义的行为。在一次运行中,新创建的对象可能碰巧在那里有一个0,另一次可能没有,有些时候它可能只是崩溃尝试读取值。你继续用未初始化的数据做更糟糕的事情。
更一般地说,当你遇到这样的问题时,我建议你放入std::cerr << xyz << '\n';
语句来转储一些相关变量,或者在调试器中追踪 - 你可能已经看到变量有垃圾值,那么可能有开始研究为什么,这可能在这里产生了一个更集中的问题,或者可能引导你找到现有的答案......
答案 2 :(得分:0)
在构造函数中初始化成员变量,如下所示
Node() {
data =0;
first = NULL;
next = NULL;
}