我有一个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或坏指针。
答案 0 :(得分:4)
问题是您正在尝试更改指针的值,但是您通过 value 传递它。因此,它是在您的函数内部更改的副本。
按值传递会创建传递给函数的对象的副本,并且在函数中对其进行的任何更改都只会对副本进行。如果要使用该函数更改指针,请通过引用传递指针。像
这样的东西void initNode(Node* &b)
{
b = new Node();
}