删除顶点并再次添加它会导致boost :: graph崩溃?

时间:2011-12-14 15:22:25

标签: boost boost-graph

我正在使用带标签的图表

typedef boost::labeled_graph<boost::adjacency_list<boost::listS, boost::listS, boost::undirectedS, Room, RoomEdge>,std::string> MyGraph;

struct LineSegment{
    LineSegment(){portalToRoom="";}
    LineSegment(QPointF startPos_, QPointF endPos_): startPos(startPos_), endPos(endPos_) { portalToRoom="";}
    QPointF startPos;
    QPointF endPos;
    QGraphicsLineItem* sceneItem;
    std::string type;
    std::string portalToRoom;
};



struct Room{
    Room(){centroid.setX(-1); centroid.setY(-1);}

    std::string category;
    std::string vertex_id;
    std::vector<LineSegment> roomLayout;
    QPointF centroid;
    QGraphicsRectItem* centroidSceneItem;
};

struct RoomEdge{
    std::string edge_id;
};

允许我使用字符串ID访问顶点。

我添加一个顶点并以这种方式设置它的相关字段:

MyVertex u = boost::add_vertex(id, g);
g[id].category = category; //crashes here
g[id].vertex_id = id; 

然后删除它们:

// First we remove all edges from this vertex
BGL_FORALL_VERTICES(v, g, MyGraph){
    if (QString(g.graph()[v].vertex_id.c_str()).compare(roomIdToBeRemoved) == 0){
        ve = v;
        BGL_FORALL_OUTEDGES(v, e, g, MyGraph) {
            ev.push_back(e);
        }
    }
}

foreach(MyEdge e, ev){
    remove_edge(e,g);
}

// Then we remove the vertex itself
remove_vertex(roomIdToBeRemoved.toStdString().c_str(),g);

到目前为止似乎有效。麻烦的是,如果我想再次使用相同的id添加删除的顶点,我会得到以下结果:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)

设置新添加顶点的字段(上面注释“崩溃在这里”)。

可能是什么原因?我正在使用boost函数来删除/添加内容。

1 个答案:

答案 0 :(得分:2)

崩溃是boost::labeled_graph实施过程中出现错误的结果。它存在于Boost 1.54.0和1.55.0(最新版本)中。我通过Boost的Trac reported it

我设法写了一个简单的测试用例来揭示问题。通过valgrind运行它可以证明问题存在。我还创建了一个简单的补丁,修复了boost::adjacency_list设置的问题(请参阅所有这些文件的错误报告)。