У меня есть 2 набора указателей, из которых я хочу удалить определенный указатель. Но это дает мне двойную ошибку в последней строке функции удаления края.
Сначала я подозревал, что, возможно, это произошло потому, что set::erase()
неявно вызывал delete
, но я прочитал некоторые документы и обнаружил, чтодеструктор не будет вызван, потому что edge_ins
и edge_outs
являются обоими наборами указателей на края.
Теперь я не уверен, что вызывает ошибку двойного освобождения при втором вызове set::erase()
поэтому я пришел сюда за помощью.
У меня есть подозрение, что это может быть из-за того, что указатели обрабатываются как объекты, а когда я стираю тот же указатель из root->edge_outs.erase(e)
, он уже исчезает, поэтому происходит сбой из-за второгопозвоните по номеру 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);
}
Может быть уместно, поэтому я также добавлю, как я выделяю память дляthe Edge.
Создание 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;
}
UPDATE : я изменил код, чтобы не разыменовывать удаленный объектно все равно выдает двойную ошибку.
Новый код:
SDG::delete_edge(std::set<Edge*>::iterator e)
{
(*e)->head->rm_in(e);
(*e)->root->rm_out(e);
delete *e;
}