2017-02-01 29 views
-1

這是一個來自我正在處理的較大程序的快速示例程序。這是不完美的,但它傳達我有數據消失,指針指向不同的對象

#include <iostream> 
#include <vector> 

using namespace std; 
class Node { 
public: 
    vector<int> state; 
    Node *parent; //Parent node 

    //Initial Node 
    Node(const vector<int> &s) : state(s) {} 

    //Other Nodes 
    Node(const vector<int> &state, Node &p) : state(state), parent(&p){ } 
}; 

int main() { 

    //Initial Node 
    vector<int> initialState = { 1,2,3 }; 
    Node initialNode(initialState); 

    vector<Node> listNodes; 
    listNodes.push_back(initialNode); 

    while (!listNodes.empty()) { //lisNodes[i].parent->state = {}; 2nd iteration 
     Node node = listNodes.back(); //node.parent appears to point to node; 2nd iteration 
     listNodes.erase(listNodes.begin()); 

     for (int i = 0; i < 2; i++) { 
      vector<int> childState = { i+4,i+5,i+6 }; 
      Node childNode(childState, node); 
      listNodes.push_back(childNode); 
     } //Inside for loop lisNodes[i].parent->state = {i+4,i+5,i+6} 

    } 

    return 0; 

} 

在while循環的第二次迭代的問題,父母的內部listNodes狀態是空

//lisNodes[i].parent->state = {} 

而且,parentnode似乎指向自己在第二次運行而不是實際的父節點

我不知道爲什麼會發生這種情況或可能的解決辦法。

+0

在發佈的代碼中沒有第二個while循環。 – jpo38

+0

第二次迭代我認爲... – Michael

+0

編輯狀態第二次迭代 –

回答

3

的一個主要問題是

Node node = listNodes.back(); 

這裏node是本地的,而循環但你存儲指向它。當該節點在循環結束時被銷燬時,所有指針現在都是懸掛的。

一般的解決將是使用

Node& node = listNodes.back(); 

所以,現在你有一個持久的對象,你可以參考一下。與不過的問題是你用

listNodes.erase(listNodes.begin()); 

修改矢量該行所有的指針和引用的迭代器後的向量元素是無效和back()爲您提供了將無效的元素之後。

您將要切換到引用未失效的容器,或者找到填充樹結構的不同方法。

相關問題