0

我正在构建一棵树,其中的node类有两个指向子节点的指针。在构建树时,我使用节点向量进行操作,最终将它们指向彼此。我经常需要将它们从向量中弹出来维护链接过程的逻辑。不幸的是,如果我指向一个节点并将其从向量中弹出,则该对象被破坏(据我所知)。关于如何让我的指针指向正确的位置或更好的系统的任何想法?

编辑——如果有帮助,这里有一些细节:

我有一个节点向量数组:Vector<node> nVec[3]

对于我需要为我的程序进行的每一级解析,它将用节点填充这 3 个向量。然后,基于其他解析数据,我将系统地链接节点。为此,我填充了向量,并且在某个点我需要链接到nVec[3].back()from 某个节点nVec[2]并将其弹出,这样,如果我想再做一次,我就不会链接到同一个元素。

4

2 回答 2

2

这取决于您如何将它们存储在std::vector. 如果你有一个std::vector<node>,那么是的,node当你从向量中删除它们时,存储在向量中的对象将被销毁。

但是,如果您有一个指针向量 ( std::vector<node*>) 并在将它们推入 ( ) 之前动态分配您的节点,nodes.push_back(new node();)它们将一直存在,直到您明确delete它们为止。但是,您稍后必须记住delete这些节点。要安全地使用动态分配,请使用智能指针向量,例如std::vector<std::shared_ptr<node>>.

于 2013-02-23T10:28:20.760 回答
0

您应该存储指向已在您的对象的指针vector

vector<Node> nodes;
nodes.push_back(Node(foo));

不好。_

vector<Node*> nodes;
nodes.push_back(new Node(foo));

很好,因为现在节点被分配到堆上并且从集合中删除时不会被破坏。

我建议您使用智能指针(unique_ptrshared_ptr) 来管理资源分配和释放,因为此时您可能最终会忘记您拥有多少对单个对象的引用。

于 2013-02-23T10:29:54.173 回答