我正在构建一个node
类的树,它有两个指向子节点的指针。在构造树时,我使用节点向量进行操作,最后我将它们指向彼此。我经常需要从向量中弹出它们以维护链接过程的逻辑。不幸的是,如果我指向一个节点并将其从向量中弹出,那么对象就会被破坏(据我所知)。关于如何让我的指针指向正确的位置或更好的系统的任何想法?
编辑 - 如果它有帮助,这里有一些细节:
我有一组节点向量:Vector<node> nVec[3]
对于我需要为我的程序执行的每个解析级别,它将使用节点填充这3个向量。然后,基于其他解析数据,我将系统地链接节点。为此,我填充向量,在某个时刻我需要从nVec[3].back()
中的某个节点链接到nVec[2]
并将其弹出以便,如果我想再次执行此操作,我不会链接到同一个元素。
答案 0 :(得分:2)
这取决于您在std::vector
中存储的方式。如果您有std::vector<node>
,那么是,当您从中移除它们时,存储在向量中的node
对象将被销毁。
但是,如果你有一个指针向量(std::vector<node*>
)并在推送它们之前动态分配你的节点(nodes.push_back(new node();)
),它们将一直存在,直到你明确delete
它们为止。但是,您必须记住以后delete
这些节点。要安全地使用动态分配,请使用智能指针向量,例如std::vector<std::shared_ptr<node>>
。
答案 1 :(得分:0)
您应该存储指向vector
中已有对象的指针:
vector<Node> nodes;
nodes.push_back(Node(foo));
不好。
vector<Node*> nodes;
nodes.push_back(new Node(foo));
很好,因为现在节点已分配到堆上,并且在从集合中删除时不会被销毁。
我建议您使用smart pointer(unique_ptr
或shared_ptr
)来管理资源分配和解除分配,因为此时您最终可能会忘记对单个对象的引用数量有