正在删除指向无序映射中对象的指针
Deleting pointer to object in unordered_map
我正在尝试删除对unordered_map
元素的引用。我的课程中负责这一点的部分看起来是这样的:
class Edge:
{
public:
Node* from;
Node* to;
}
class Node:
{
public:
std::string name;
bool to_delete;
}
class Graph:
{
public:
std::unordered_map<std::string, Node> nodes;
std::vector<Edge> edges;
}
在我的主文件代码中,我正在做这样的事情:
Node n("My node");
graph.nodes.insert({n.name,n});
edge.from = &graph.nodes[n.name];
// Some other stuff
for(auto& edge : graph.edges)
{
if(edge.from->to_delete)
{
graph->nodes->erase(edge.from->name);
delete edge.from;
edge.from = NULL;
}
if(edge.to->to_delete)
{
graph->nodes->erase(edge.to->name);
delete edge.to;
edge.to = NULL;
}
if(edge->from && edge->to)
DoSomethingWithNodes(edge->from, edge->to);
else
removeEdge(edge);
}
目前,我正在删除基于这个答案的指针,但我在delete
行上遇到了分段错误。在同一答案中,还建议使用smart pointers
。我不确定是否使用这里的shared_ptr。我在这里有一个选项,即多条边将有指向一个节点对象的指针,但当我从图的无序映射中erase
节点时,实际会发生什么。如果最后一个if/else条件指向那里,我会得到false吗?我不完全理解。
编辑:
假设我想在删除节点之前显示它的名称。所以我会有这样的东西:
for(auto& edge : graph.edges)
{
if(edge.from->to_delete)
{
printf("Node to delete: %s",edge.from->name.c_str());
graph->nodes->erase(edge.from->name);
edge.from = nullptr;
}
if(edge.to->to_delete)
{
printf("Node to delete: %s",edge.to->name.c_str());
graph->nodes->erase(edge.to->name);
edge.to = nullptr;
}
if(edge->from && edge->to)
DoSomethingWithNodes(edge->from, edge->to);
}
现在,没有针对空指针的保护,因为正如我所经历的,edge.from->to_delete
有时会返回true。我所尝试的是将条件更改为:
if(edge.from && edge.from->to_delete)
但这一点帮助都没有。
目前我正在删除基于这个答案的指针
你不明白这个答案——你只能用new
创建的delete
对象来控制它们的所有权,在你的情况下,对象是由std::unordered_map
管理的,因为你通过值而不是指针来存储它们。所以在这种情况下,您不能在这些对象上调用delete
,而调用std::unordered_map::erase()
就足够删除对象了。
示例:
std::unordered_map<std::string,Someclass> mymap;
mymap.insert( std::make_pair( "foobar", Someclass() ); // adding object by value
...
mymap.erase( "foobar" ); // object managed by map and will be deleted
或者当您需要调用delete时:
std::unordered_map<std::string,Someclass *> mymap;
mymap.insert( std::make_pair( "foobar", new Someclass() ); // adding object by pointer
...
auto f = mymap.find( "foobar" );
if( f != mymap.end() ) {
delete f->second; // you need to delete object that you created by new before
mymap.erase( f );
}
相关文章:
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行