指向类对象的C ++指针

时间:2019-05-25 12:48:31

标签: c++ class

在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);

}

2 个答案:

答案 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 };
}