在C ++中使用类时遇到一个奇怪的问题。
这是我的代码,用于在链接列表中添加对象。我发现我的V1代码可以正常工作,但V2代码不能正常工作,并且printList不能在V2中停止。有谁能解释为什么会这样,因为我希望V1和V2代码应该输出相同的结果。
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node *next;
Node() {
cout << "Node object is being created" << endl;
}
};
void printList(Node *node) {
while(node != NULL) {
cout << node->data << ",";
node = node->next;
}
cout << endl;
}
void push(Node **node, int data) {
// // working V1 start
// Node *newNode = new Node();
// newNode->data = data;
// newNode->next = *node;
// *node = newNode;
// // working V1 end
// not working V2 start
Node newNode;
newNode.data = data;
newNode.next = *node;
*node = &newNode;
// not working V2 end
}
int main() {
Node *a = NULL;
push(&a, 15);
push(&a, 10);
printList(a);
}
答案 0 :(得分:2)
您的V2将指向节点的指针存储在自动存储中。该节点在push
函数的结尾处被自动销毁,此时指针悬空并且不再指向有效对象。
以后尝试通过该指针间接访问时,程序的行为是不确定的。
V1没有此问题,因为它在动态存储中分配了节点。相反,V1的问题在于它会泄漏分配的内存。用new
表达式创建的动态分配需要用delete
表达式释放。
答案 1 :(得分:0)
第二个代码段具有未定义的行为,因为1)指针newNode
未初始化,并且2)您没有在要存储值data
和*nod
e的地方分配内存
Node newNode;
newNode.data = data;
newNode.next = *node;
在第一个代码段中,为新节点分配了内存,并通过分配的内存地址初始化了指针
Node *newNode = new Node();
这些语句
newNode.data = data;
newNode.next = *node;
有效,并将数据写入分配的内存。
请注意,如果要通过以下方式定义类(删除默认构造函数)
class Node {
public:
int data;
Node *next;
};
然后可以更简单地编写函数
void push( Node **node, int data )
{
*node = new Node { data, *node };
}