繁体   English   中英

关于结构指针C ++的困惑

[英]confusion about struct pointer C++

我编写了以下代码。 我有一个问题:在这两行中:

r1 = r;
r1 = new node(); 

我认为,当r1成为一个新的空节点时, r也应该是一个新的空节点,因为r1=r是一个指针分配,因此r1r代表相同的地址。 但是我一定是错的,因为结果表明这里的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

指针就是指针,它指向(指)其他东西。

我认为在这种情况下,以图形方式了解事物可能是最容易的。 因此,执行以下操作后:

node *r = new node();
node *r1 = new node();
r->id = 100;

情况大致如下:

在此处输入图片说明

然后在执行时: r1 = r; ,您会遇到如下情况:

在此处输入图片说明

请注意,您已经泄漏了r1指向的node (即,您不再有指向它的指针,因此无法再将其删除)。

然后当你做r1 = new node(); :您得到的是这样的:

在此处输入图片说明

最后,执行r1->child = r; 你有这样的事情:

在此处输入图片说明

它们不能相同。 rr1是内存中的两个位置,可以保存到node地址(根据代码中的定义),因此,当执行r1 = r ,这些内存位置中的值将变为相同(指针值)。

但是,当您以后执行r1 = new node; 然后new返回指向新创建对象的指针,该对象仅存储在r1内存位置中。 由于存储器中r位置的地址不变,因此可以看到结果。

我有一个问题:在这两行中: r1 = r;r1 = new node(); 我认为当r1成为一个新的空节点时, r也应该是一个新的空节点,因为r1=r是一个指针分配

不。 当你做r1 = r; 所有你做的是价值设定r1 ,以相同的值r 它不会将r1r链接在一起,并且您在r1中所做的任何更改都不会对r

您还应注意, r1 = r; 导致内存泄漏,因为r1不再指向您最初创建的节点,并且您在分配之前没有deletedelete

逐步执行代码可能有助于解释发生了什么。

    node *r = new node();

创建内存块A并将r指向A

    node *r1 = new node();

创建内存块B并将r1指向B

    r->id = 100;

取消引用r以找到A。 A中的 id设置为100

    r1 = r;

r1r指向同一点。 r1现在指向A。 AB之间没有链接。 没有任何内容从A复制到B。 r1仅重定向到点A而不是B。

B不再具有引荐来源,并且丢失了。 这称为内存泄漏。 delete r1; 在重新分配之前,以防止这种情况。 更好的是,因为从不使用B ,所以不要一开始就分配它。

    r1 = new node();

创建内存块C并将r1指向C。 如上所述, r1指向C而不是A。 没有复制或其他副作用。 r1A之间不再有任何关联。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM