我认为有两组代码是等效的,但一组会导致段错误,另一组不会。我真的很困惑为什么会这样……
我想要的是创建一个查找功能
此代码确实有效:
MyPair <Comparable, BinomialNode<Comparable>*> dummy(x, NULL);
MyPair <Comparable, BinomialNode<Comparable>*>* pair = hashTable.find(dummy);
if(pair!=NULL)
{
addDupe(x, pair);
}
void addDupe( Word & x, MyPair<Word, BinomialNode<Word>*>* pair)
{
list<int>::iterator it;
list<int> lines = x.getLineNums();
for ( it=lines.begin(); it != lines.end(); it++ )
{
pair->second->element.addLineNum(*it);
}
}
下面的代码不起作用。上面的变化是我试图做的是尝试将查找函数移出并使其返回一个 BinomialNode*,这将是 MyPair 中的第二个元素。此版本中的 addDupe 处理 BinomialNode* 而不是 MyPair*。
我跟踪了段错误以返回pair-> second。
为什么这会导致段错误但上面的 pair->second->element.addLineNum(*it) 不会?
BinomialNode<Comparable>* node = find(x);
if(node!=NULL)
{
addDupe(x, node);
}
BinomialNode<Comparable>* find(Comparable& x)
{
MyPair <Comparable, BinomialNode<Comparable>*> dummy(x, NULL);
MyPair <Comparable, BinomialNode<Comparable>*>* pair = hashTable.find(dummy);
if(pair!=NULL)
return NULL;
return pair->second; //LINE CAUSES SEGFAULT
}
void addDupe( Word & x, BinomialNode<Word>* node)
{
list<int>::iterator it;
list<int> lines = x.getLineNums();
for ( it=lines.begin(); it != lines.end(); it++ )
{
node->element.addLineNum(*it);
}
}