在堆上初始化的指针数据成员

Pointer data member initilized on the heap

我有一个节点 class 和一个节点管理器 class。 NodeManager 对象持有指向 Node 的指针。我希望这个 Node 指针指向在堆上分配的 Node 对象。堆分配发生在 NodeManager.init().

这是代码。

class Node
{
public:
    int index;
};

class NodeManager
{
public:
    NodeManager() {}
    void initNode(Node *b)
    {
        b = new Node();
    }

    Node *node;
};

int main()
{
    NodeManager manager;
    manager.initNode(manager.node);

    cout << manager.node << endl; //prints a bad pointer

    system("pause");
    return 0;
}

当然,当我把initNode()改成:

void initNode()
{
    this->node = new Node();
}

manager 对象实际上 "remembers" 它的 node 地址。 问题是在第一个代码中,地址没有被记住,应用程序打印出一个错误的地址。这是为什么?

编辑: 为了让事情更清楚,我正在使用一个 class ,它有一个数据成员,它是一个指向对象的指针。我的 class 有一个递归成员函数,它将其数据成员指针作为 "starting point" 参数,并不断调用自身来分配和创建对象的 "children" 。但是后来,我遇到了这个问题。私有数据成员未被记住,结果是 NULL 或坏指针。

问题是您试图更改指针的值,但您传递的是 value。因此,它是在您的函数内部更改的副本。

按值传递创建传递给函数的对象的副本,并且在函数内对其所做的任何更改仅对 副本 进行。如果要使用函数更改指针,则改为通过引用传递指针。像

void initNode(Node* &b)
{
    b = new Node();
}