class node
{
public:
node* next;
int val;
};
void func(node* root)
{
node* p=root->next;
delete p;
p=nullptr;
}
int main()
{
node* root=new node();
node* nxt=new node();
root->val=1;root->next=nxt;
nxt->val=2;nxt->next=nullptr;
func(root);
cout<<(nxt==nullptr)<<endl;//false
cout<<(root->next==nullptr)<<endl;//false
}
如何修改func()讓最后兩行輸出 1?您只能nxt通過rootin洗掉func()。
編輯:
起初我認為root->next并且nxt是一回事,因為root->next=nxt它root->next只是一個副本nxt。它們具有相同的值但存盤在不同的記憶體中。換句話說,它們是兩個不同的指標但指向相同的記憶體where 存盤了一個nodewithval==2和。next==nullptr因此不可能通過 洗掉nxt。root同樣的錯誤發生在func()。
root->next我修改代碼以顯示 和 之間的相似性和差異nxt。
int main()
{
node* root=new node();
node* nxt=new node();
root->val=1;root->next=nxt;
nxt->val=2;nxt->next=nullptr;
//point to same memory
cout<<(root->next)<<endl;
cout<<(nxt)<<endl;
cout<<"---------"<<endl;
//stored in different memory
cout<<&(root->next)<<endl;
cout<<&nxt<<endl;
}
并得到這樣的輸出:
0x7219b0
0x7219b0
---------
0x7219a0
0x61ff08
更重要的是,我發現root->next減法&(root->next)總是0x10。在我看來,第一個值是val==2存盤節點的位置,第二個值是節點中的記憶體val==1。我猜這是因為這兩個節點幾乎同時分配,因此作業系統將它們分配在連續的記憶體段中。
希望這可以幫助其他初學者。
uj5u.com熱心網友回復:
在func(),p是它自己的唯一變數。在您的示例中,它包含保存在中的地址的副本root->next。所以,無論你對p自己做什么,都不會產生root->next任何影響。但是,當您呼叫 時delete p,您正在破壞和都指向的Node物件。您正在設定為(這是多余的,因為之后立即超出范圍),但是您正在懸空。proot->nextpnullptrproot->next
要修復func()以使(root->next==nullptr)條件在 中變為真main(),您有兩種選擇:
擺脫
p并直接采取行動root->next:void func(node* root) { delete root->next; root->next = nullptr; }make
p是對而不是副本的參考:root->nextvoid func(node* root) { node* &p = root->next; delete p; p = nullptr; }
但是,沒有什么func()可以影響nxt變數 in main(),因為nxt它是本地的main()并且不存在func()任何概念nxt。這就是為什么(nxt==nullptr)在您的示例中條件永遠不會成為真的原因。事實上,nxt變數根本不需要存在,例如:
class node
{
public:
int val;
node* next = nullptr;
};
void func(node* root)
{
node* &p = root->next;
delete p;
p = nullptr;
}
int main()
{
node* root = new node{1};
root->next = new node{2};
func(root);
cout << (root->next == nullptr) << endl; // true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/493274.html
下一篇:指向字串的指標陣列
