Удаление вершины и добавление ее снова вызывает сбой в boost :: graph? - PullRequest
0 голосов
/ 14 декабря 2011

Я использую помеченный график

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

, который позволяет мне получить доступ к вершинам с помощью строковых идентификаторов.

Я добавляю вершину и устанавливаю соответствующие поля следующим образом:

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

Пока что это похоже на работу. Проблема в том, что если я хочу добавить удаленную вершину еще раз с тем же идентификатором, я получаю следующее:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)

при настройке полей вновь добавленной вершины (выше комментируется "вылетает здесь").

В чем может быть причина? Я использую функции повышения для удаления / добавления вещей.

1 Ответ

2 голосов
/ 13 декабря 2013

Сбой является результатом ошибки в реализации boost::labeled_graph. Он присутствует в Boost 1.54.0 и 1.55.0 (последняя версия). Я сообщил об этом через Boost's Trac.

Мне удалось написать простой контрольный пример, который выявляет проблему. Запуск через valgrind доказывает, что проблема существует. Я также создал простой патч, который исправляет проблему для моей настройки boost::adjacency_list (см. Отчет об ошибке для всех этих файлов).

...