Boost::edge导致段故障

boost::edge causing segfault

本文关键字:故障 edge Boost 段故障      更新时间:2023-10-16

我试图使用boost图形库,当我尝试使用boost::edge()时,我得到了一个段故障。完整的代码在这里可用,但在这里我做了一个最小的程序,有同样的问题(我用"g++ minimal.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->3n", res.second ? "" : "not ");
    return 0;
}

如果我取消add_edge, remove_edge行注释,段错误不会发生,程序打印预期的

G does not have an edge 1->3

但是有办法避免这种黑客行为吗?谢谢!

显然,如果需要,add_edge(1,3,G)调用会向图添加顶点。你的第一个电话是在那个箱子里。然后将从顶点1到顶点3的边相加。请注意,在此调用之后,顶点的数量为4,因为顶点的索引从0到3。

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

另一方面,对edge(1,3,G)的调用并不向图中添加任何顶点,返回的布尔值用于声明顶点1和3是否连接。如果因为索引1和3的顶点不存在而删除了add_edge,则存在访问冲突。

你可以简单地用想要的顶点数初始化图形:

graph_t G(4);