[英]confusion about struct pointer C++
我编写了以下代码。 我有一个问题:在这两行中:
r1 = r;
r1 = new node();
我认为,当r1
成为一个新的空节点时, r
也应该是一个新的空节点,因为r1=r
是一个指针分配,因此r1
和r
代表相同的地址。 但是我一定是错的,因为结果表明这里的r
没有改变。 有人可以向我解释为什么r
不变吗? 谢谢。
#include<iostream>
using namespace std;
struct node{
int id;
node *child;
};
int main()
{
node *r = new node();
node *r1 = new node();
r->id = 100;
r1 = r;
r1 = new node();
r1->child = r;
cout << "r1 " << r1->id << endl;
cout << "r1 child " << (r1->child)->id << endl;
}
结果:
r1 0
r1 child 100
它们不能相同。 r
和r1
是内存中的两个位置,可以保存到node
地址(根据代码中的定义),因此,当执行r1 = r
,这些内存位置中的值将变为相同(指针值)。
但是,当您以后执行r1 = new node;
然后new
返回指向新创建对象的指针,该对象仅存储在r1
内存位置中。 由于存储器中r
位置的地址不变,因此可以看到结果。
我有一个问题:在这两行中:
r1 = r;r1 = new node();
我认为当r1
成为一个新的空节点时,r
也应该是一个新的空节点,因为r1=r
是一个指针分配
不。 当你做r1 = r;
所有你做的是价值设定r1
,以相同的值r
它不会将r1
和r
链接在一起,并且您在r1
中所做的任何更改都不会对r
。
您还应注意, r1 = r;
导致内存泄漏,因为r1
不再指向您最初创建的节点,并且您在分配之前没有delete
其delete
。
逐步执行代码可能有助于解释发生了什么。
node *r = new node();
创建内存块A并将r
指向A
node *r1 = new node();
创建内存块B并将r1
指向B
r->id = 100;
取消引用r
以找到A。 A中的 id
设置为100
r1 = r;
将r1
与r
指向同一点。 r1
现在指向A。 A和B之间没有链接。 没有任何内容从A复制到B。 r1
仅重定向到点A而不是B。
B不再具有引荐来源,并且丢失了。 这称为内存泄漏。 delete r1;
在重新分配之前,以防止这种情况。 更好的是,因为从不使用B ,所以不要一开始就分配它。
r1 = new node();
创建内存块C并将r1
指向C。 如上所述, r1
指向C而不是A。 没有复制或其他副作用。 r1
和A之间不再有任何关联。 A不变, r
仍然指向A。
r1->child = r;
解除引用r1
以找到C。 将C中的 child
指向A。
cout << "r1 " << r1->id << endl;
解除引用r1
以找到C。 在C中打印出id
。 C中的id
从未分配值,因此使用它是未定义的行为。 可能会打印任何值,可能不会打印任何内容,或者该程序可能会使计算机变大腿并吃掉邻居的猫,尽管这不太可能。
cout << "r1 child " << (r1->child)->id << endl;
解除引用r1
以找到C。 在C中取消引用child
级以找到A。 在A ,100中打印出id
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.