我試圖撰寫一個 n 元樹,每個節點包含 4 個元素,1 個向量<Node*>,3 個變數。
當我嘗試通過指標分配值時,我發現該值將被后值覆寫。
我想可能是因為指標指向每個值,所以所有的值都會相同。所以我嘗試將指標設定為NULL,但它仍然不起作用。
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
struct Node{
vector<Node*> subNodes;
bool isFile=0;
bool isDir=0;
int value=0;
};
int main()
{
Node* rootNode_ptr;
Node rootNode;
rootNode_ptr =&rootNode;
rootNode_ptr->value=99;
for(int i=0;i<5;i ){
Node* subNode_ptr;
Node subNode;
subNode_ptr=NULL;
subNode_ptr = &subNode;
subNode_ptr->value=i;
rootNode_ptr->subNodes.push_back(subNode_ptr);
cout<<"0 : "<<rootNode_ptr->subNodes[0]->value<<endl;
cout<<rootNode_ptr->subNodes[i]->value<<endl;
}
return 0;
}
subNodes[0].value 不斷變化

uj5u.com熱心網友回復:
在 for 回圈中宣告的變數在堆疊上。一旦它們超出范圍(例如,您的回圈重復或回圈終止),則變數將被銷毀。當您從它們中讀取時,存盤指向已銷毀物件的指標會導致未定義的行為。您需要物件保持更長時間。最明顯的方法是在堆上分配它們(可能通過使用“new”操作或 std::make_unique() ),并且它們不會消失,直到您洗掉它們(或 unique_ptr 超出范圍。 )
在分配給它之前將指標設定為 null 無濟于事。
所以而不是這個:
Node* subNode_ptr;
Node subNode;
subNode_ptr=NULL;
subNode_ptr = &subNode;
subNode_ptr->value=i;
試試這個: Node subNode_ptr = new Node; subNode_ptr->value = i;
并且一定要在以后清理它。您節點的解構式需要迭代向量并洗掉每個元素。此外,您還需要擔心將一個節點復制并分配給另一個節點,因為指標向量需要進行深度復制。(因為節點“認為”他們擁有指向的物件,如果兩個都指向同一個物件,并且一個后來被銷毀,它將洗掉該物件。然后剩余的副本將嘗試使用它并且 UB 發生。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/352381.html
