我有两组指针,我想从中删除某个指针。但它在删除边缘函数的最后一行给了我一个双重免费错误。
我最初怀疑可能是因为set::erase()
隐式调用delete
,但我阅读了一些文档并发现不会调用析构函数,因为edge_ins
它们edge_outs
都是指向 Edge 的指针集。
现在我不确定是什么导致第二次调用时出现双重免费错误,set::erase()
所以我来这里寻求帮助。
我怀疑这可能是因为指针被视为对象,当我从中删除相同的指针时,root->edge_outs.erase(e)
它已经消失了,所以它由于第二次调用 at 而崩溃root->edge_ins.erase(e)
。但到目前为止,我找不到任何有用的东西。
边缘删除:
std::set<Edge*>::iterator
SDG::delete_edge(std::set<Edge*>::iterator e)
{
delete *e;
(*e)->head->edge_ins.erase(e);
return (*e)->root->edge_outs.erase(e);
}
可能是相关的,所以我还将添加我如何为 Edge 分配内存。
边缘创建:
Edge&
SDG::edge(Vertex* out, Vertex* in, Edge::Type type)
{
// 新しいエッジを生成
Edge* edge = new Edge(type, *out, *in);
// 頂点からエッジへの参照
out->add_out(edge);
in->add_in(edge);
return *edge;
}
更新:我已经更改了代码,这样我就不会取消引用已删除的对象,但它仍然会给出双重释放错误。
新代码:
SDG::delete_edge(std::set<Edge*>::iterator e)
{
(*e)->head->rm_in(e);
(*e)->root->rm_out(e);
delete *e;
}