C++ 从 2 组指针中删除指针
c++ deleting a pointer from 2 sets of pointers
我有 2 组指针,我想从中删除某个指针。但它在删除边缘函数的最后一行给了我一个双重自由错误。
我最初怀疑可能是因为set::erase()
隐式调用delete
但我阅读了一些文档,发现不会调用析构函数,因为edge_ins
和edge_outs
都是指向 Edge 的指针集。
现在我不确定是什么导致了第二次调用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);
}
可能是相关的,所以我还将添加如何为 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;
}
问题解决了。
问题在于,这个delete_edge
函数将edge_outs
中的std::set<Edge*>::iterator
作为参数。然后继续从另一个集合中删除元素,这edge_ins
导致未定义的行为,以某种方式导致双重释放。
为了解决这个问题,我从根本上改变了delete_edge
函数,以便它需要Edge*
,以便函数的用户不会感到困惑。
至于返回值,它最初打算用于在程序迭代它时删除edge_outs
元素。所以我需要一个使用iterator = edge_outs.erase(iterator)
的循环,但我也想同时从edge_ins
中删除相同的元素。因此,我想出了一个确保正确删除边缘的功能,但似乎我在第一次尝试时失败了。
这是该函数的更好版本:
void
SDG::delete_edge(Edge* e)
{
e->head->edge_ins.erase(e);
e->root->edge_outs.erase(e);
delete e;
}
使用此功能时,在修复之前是这样使用的:
iterator = delete_edge(iterator)
但是当您执行以下操作时,我意识到修复后它具有相同的效果:
delete_edge(*(iterator++))
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存