ブーストグラフライブラリの幅優先探索の使用に問題があります。グラフの訪問が終了した後、訪問者クラスの属性を取得したいと思います。
// init my visitor
BfsVisitor bv;
// auto like in C++-0x
BOOST_AUTO (visit, boost::visitor(bv));
// launch search
boost::breadth_first_search (graph, vertex, visit);
// get result ("typedef pair<string, int*> result")
result res = bv.getResult();
// print res: SegFault, `res.second' is NULL
std::cout << *(res.second) << std::endl;
私のBfsVisitorは次のように定義されています:
class BfsVisitor : public boost::default_bfs_visitor
{
public:
BfsVisitor()
{
std::cout << boost::this_thread::get_id()
<<" ~~ CONSTRUCTOR" << std::endl;
}
BfsVisitor(const BfsVisitor& b)
: boost::bfs_visitor<>(),
_res (b._res),
_arg (b._arg)
{
std::cout << boost::this_thread::get_id()
<<" ~~ COPY" << std::endl;
}
~BfsVisitor()
{
std::cout << boost::this_thread::get_id()
<<" ~~ DESTRUCTOR" << std::endl;
}
/// Visitor methods
void discover_vertex(const vertex_t& s,
const Graph& g)
{
std::cout << boost::this_thread::get_id()
<< " -> Discover vertex: " << g[s]._id << std::endl;
Executive exec* = g[s]._executive;
_arg.insert(_res);
exec->setArguments(_arg);
// other process
}
void examine_vertex(const vertex_t& s,
const Graph& g)
{
std::cout << boost::this_thread::get_id()
<< " -> Examine vertex: " << g[s]._id << std::endl;
Executive exec* = g[s]._executive;
exec->launch(&_res);
// other process
}
/// Getter
result getResult() const
{
std::cout << boost::this_thread::get_id()
<< " ~~ Get Result" << std::endl;
return _res;
}
private:
result _res;
argument _arg; // typedef std::map
}
私の問題は、プロセス中の訪問者のコンボコピー/破壊にあると思います。ここでは、1つのスレッドのみを使用した小さなグラフ([1]-> [2]-> [3])の出力例です。
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 -> Discover vertex: 1
b7495b40 -> Examine vertex: 1
b7495b40 -> Discover vertex: 2
b7495b40 -> Examine vertex: 2
b7495b40 -> Discover vertex: 3
b7495b40 -> Examine vertex: 3
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ Get Result
Segmentation fault (core dumped)
Examin_vertexメソッドで実行するすべてのプロセスの最後に自分の属性にアクセスしたいだけです。ブーストグラフの訪問者のドキュメントを確認しましたが、問題の解決策について何も見つかりませんでした。あなたが提案するアイデアを持っていることを願っています。