c++ - 删除指向 unordered_map 中对象的指针

标签 c++

我正在尝试删除对 unordered_map 元素的引用。我负责的类(class)部分如下所示:

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);
    }

目前我正在删除基于此 answer 的指针但我在使用 delete 时遇到段错误。在同一个答案中,还建议使用 smart pointers。我不确定在这里使用 shared_ptr .我在这里有一个选项,即多条边将具有指向一个节点对象的指针,但是当我从图的 unordered_map 中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 条件更改为:

if(edge.from && edge.from->to_delete)

但是一点用都没有。

最佳答案

Currently I am deleting pointers based on this answer

您不明白这个答案 - 您只能删除new 创建的对象并且您控制它们的所有权,您的情况下的对象由 管理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++ - 删除指向 unordered_map 中对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36481144/

相关文章:

c++ - 交换后 vector 会保持连续吗?

c++ - 从另一个命名空间访问标准命名空间数据成员

c++ - 我的 COM 服务器中需要作业队列吗?

c++ - 事件窗口更改时收到通知

c++ - C++中未设置的 boolean 值的默认值?

c++ - 尝试在 fedora 25 上链接 SFML 应用程序

c++ - 我想将我的 arr[] 值存储为 2 的幂。但是我得到的一些输出并不是我真正想要的

C# 看不到带参数的 C++ 构造函数

C++ QLineEdit : setmaxlength() for number of bytes and not the number of the characters?

c++ - 我的 unordered_set 元素在一个范围内发生变化而不修改它们