在堆上初始化的指针数据成员
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();
}
我有一个节点 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();
}