指针数据成员在堆上启动

时间:2015-04-20 18:54:58

标签: c++ pointers dynamic-allocation

我有一个Node类和一个NodeManager类。 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对象实际上“记住”其node的地址。 问题是在第一个代码中,地址不会被记住,应用程序会打印出错误的地址。那是为什么?

编辑: 为了使事情更清楚,我正在使用一个具有数据成员的类,该成员是指向对象的指针。我的类有一个递归成员函数,它将其数据成员指针作为“起始点”参数,并继续调用自己来分配和创建对象的“子”。但后来,我遇到了这个问题。私有数据成员不会被记住,结果证明是NULL或坏指针。

1 个答案:

答案 0 :(得分:4)

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

按值传递会创建传递给函数的对象的副本,并且在函数中对其进行的任何更改都只会对副本进行。如果要使用该函数更改指针,请通过引用传递指针。像

这样的东西
void initNode(Node* &b)
{
    b = new Node();
}