【发布时间】:2012-07-28 17:59:16
【问题描述】:
我有一个单一的深度优先搜索算法来遍历我的图,给定一个起始节点的迭代器。
文档摘要:
-
GraphIter是Graph::iterator的 typedef -
Graph类 扩展map<string, Node> -
start->second.edges()返回set<string>
如果start->second.edges() 的size 为0,则此代码会导致分段错误:
(为简洁起见,我已经截断了不相关的部分,包括递归调用。)
错误代码
void Graph::dfs(GraphIter start)
{
cout << "EDGES SIZE: " << start->second.edges().size() << endl;
for (set<string>::iterator it = start->second.edges().begin();
it != start->second.edges().end(); ++it)
{
GraphIter iter = this->find(*it); // <--- SEGMENTATION FAULT
}
}
现在看看当我将start->second.edges() 拉入一个局部变量时会发生什么:不再有段错误!
这是不产生段错误的代码:
好代码
void Graph::dfs(GraphIter start)
{
set<string> edges = start->second.edges(); // <--- MAGIC TRICK
cout << "EDGES SIZE: " << edges.size() << endl;
for (set<string>::iterator it = edges.begin();
it != edges.end(); ++it)
{
GraphIter iter = this->find(*it);
}
}
所以区别在于,在好的代码中,当字符串集合的size(来自edges()方法)为0时,for在第二种情况下永远不会进入循环。但在第一种情况下,for 循环仍然至少执行一次,直到它意识到它无法取消引用 it 变量。
为什么这些不同?他们不是访问相同的内存部分吗?
【问题讨论】:
标签: c++ iterator segmentation-fault iteration