数据消失,指针指向不同的对象

时间:2017-02-01 20:11:05

标签: c++ pointers

这是一个来自我正在开展的大型计划的快速示例程序。这并不完美,但它传达了我所拥有的问题

#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 = {}

此外,parent中的node似乎在第二次运行期间指向自身,而不是实际的父节点

我不确定为什么会发生这种情况或者可能解决这个问题。

1 个答案:

答案 0 :(得分:3)

一个主要问题是

Node node = listNodes.back();

这里node是while循环的本地,但你存储指向它的指针。当该节点在循环结束时被销毁时,所有指针现在都悬空了。

一般来说,解决方法是使用

Node& node = listNodes.back();

所以现在你有一个可以引用的持久对象。但问题是您正在使用

修改向量
listNodes.erase(listNodes.begin());

在该行之后,迭代器之后所有指针和向量中元素的引用都将失效,back()会为您提供一个无效的元素。

您将切换到未使引用无效的容器,或者找到填充树结构的不同方法。