我正在尝试创建一个节点类。node类有两个变量:一个是int,一个是指向另一个节点的指针。这是我的节点构造函数。我在另一个堆栈溢出中发现,为了为值分配内存,您需要包含"new…";短语。
Node::Node() {
next = new Node;
}
Node::Node(int new_num) {
num = new_num;
next = new Node;
}
我正在使用一种名为AssignArray的方法,该方法采用整数数组并将其转换为节点链表。它的部分工作,除了当我试图在我的节点上使用setNext方法。setNext方法只是一个常规的setter方法。
void Node::setNext(Node* new_next) {
next = new_next;
}
Node* Node::AssignArray(int list[], int i, int size) {
if (i == size) {
return NULL;
}
else {
Node new_node(list[i]);
i++;
new_node.setNext(new_node.AssignArray(list, i , size));
return &new_node;
}
}
下面是目前为止我的主要函数:
int main() {
int nums1[] = {1,2,3,4,5};
int nums2[] = {1,3,5,7,9};
Node node1 = Node();
int nums1_size = sizeof(nums1)/sizeof(nums1[0]);
node1.AssignArray(nums1, 0, nums1_size);
主要问题是,您正在使用AssignArray
的返回值调用setNext
,您返回&new_node
,这是指向您在堆栈上分配的本地Node
的指针。函数一返回,堆栈就展开,Node
实例就不存在了,指针就悬空了。
至少你应该这样做:
Node* new_node = new Node(list[i]);
...
return new_node;
但我也觉得我们遗漏了一些东西。很高兴看到Node
的定义。为什么这个构造函数没有产生堆栈溢出?
Node::Node() {
next = new Node;
}
在构造函数中,您执行new Node
,这将再次调用相同的构造函数…它将再次调用构造函数…
嗯。
我认为在构造函数中添加了新节点,同时通过自身进行无限循环。
Node::Node() {
next = new Node;
}
最好避免这种类型的调用。