【问题标题】:boost::edge causing segfaultboost::edge 导致段错误
【发布时间】:2013-03-03 15:27:16
【问题描述】:

我正在尝试使用 boost 图形库,当我尝试使用 boost::edge() 时遇到了段错误。完整代码可在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 行,则不会发生段错误,并且程序会打印预期的

G does not have an edge 1->3

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

【问题讨论】:

  • 这看起来很像一个错误。如果您无法在 Stackoverflow 上获得适当的回复,您可能需要在 Boost-Devel Mailing List 上提出。

标签: c++ boost boost-graph


【解决方案1】:

显然,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);

【讨论】:

  • 感谢您的关注,但这是 6 个月前发布的。我不再积极从事这个项目。另外,从上面的例子中也不清楚,但我认为它一定比你描述的要复杂一些。我认为调用 add_edge(1,3,G) 不会添加顶点 0 和 4。
  • 其实我用调试器跟踪了指令,惊讶地发现“if (x >= num_vertices(g_)) g_.m_vertices.resize(x + 1);” (boost\graph\detail\adjacency_list.hpp, line 2186, boost 1.50)
  • 无论如何,这类问题都值得回答。
  • 嗯,我想你是对的。我对接受您的回答犹豫不决,因为它需要初始化图形,但听起来即使这样也隐含地发生了。干得好!
  • 实现对我来说似乎很奇怪。如果请求的边的任何一个顶点不存在,我希望它返回 .second=false。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2015-09-03
  • 2012-08-17
相关资源
最近更新 更多