[英]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.