C++ 指向类对象的指针

标签 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);

}

最佳答案

您的 V2 在自动存储中存储指向节点的指针。该节点在 push 函数结束时自动销毁,此时指针悬空,不再指向有效对象。

当您稍后尝试通过该指针间接访问时,程序的行为是未定义的。


V1 没有这个问题,因为它在动态存储中分配节点。相反,V1 的问题是它泄漏了分配的内存。使用 new-expression 创建的动态分配需要使用 delete-expression 释放。

关于C++ 指向类对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56304965/

相关文章:

php - 在AS3中使用自定义类处理数据库查询

c++ - 您如何搜索具有哈希名称的 vector 以进行匹配?

c++ - 识别 C/C++ 中未使用的函数

c++ - 如何将 CINT 嵌入到 Windows 上的 C++ 应用程序中?

lisp - 测试一个类是否是普通 lisp 中另一个类的子类

php - Laravel 5 包,找不到类

c++ - 未初始化的数据和 memcpy

c++ - mingw 运行时代码的 Unix 替代方案

c++ - 引发异常:读取访问冲突。这是对象数组中的nullptr

java - 迭代期间 HashSet NullPointerException 错误