代码之家  ›  专栏  ›  技术社区  ›  bgschiller

boost::边缘导致segfault

  •  6
  • bgschiller  · 技术社区  · 11 年前

    我正在尝试使用boost图库,当我尝试使用boost::edge()时,我得到了一个segfault。完整代码可用 here ,但在这里,我制作了一个具有相同问题的最小化程序(我使用“g++minimum.cpp”进行编译):

    #include<stdio.h>
    #include<boost/graph/adjacency_list.hpp>
    
    using namespace boost;
    using namespace std;
    
    typedef adjacency_list<> graph_t;
    typedef graph_traits<graph_t>::edge_descriptor edge_descriptor;
    
    int main(){
        graph_t G;
        //add_edge(1,3,G);
        //remove_edge(1,3,G);
        pair<edge_descriptor, bool> res = edge(1,3,G);
        printf("G does %shave an edge 1->3\n", res.second ? "" : "not ");
        return 0;
    }
    

    如果我取消对add_edge、remove_edge行的注释,则不会出现segfault,并且程序会打印预期的

    G does not have an edge 1->3
    

    但有没有办法避免这种恶作剧?谢谢

    1 回复  |  直到 11 年前
        1
  •  1
  •   Raffi    11 年前

    显然 add_edge(1,3,G) 如果需要,调用会将顶点添加到图形中。你的第一个电话就是在这种情况下。然后,它将顶点1的边添加到顶点3。请注意,在该调用之后,顶点的数量为4,因为顶点随后从0索引到3。

    对的后续调用 remove_edge(1,3,G) 删除刚添加的边,但保持顶点数不变。

    对的呼叫 edge(1,3,G) 另一方面,不向图中添加任何顶点,返回中的布尔值用于说明顶点1和3是否连接。如果您删除 add_edge 因为索引1和3处的顶点不存在。

    您可以简单地使用所需数量的顶点初始化图形:

    graph_t G(4);