C++程序调用getNextWord()时触发段错误(Segfault)的排查求助
C++程序调用getNextWord()时触发段错误(Segfault)的排查求助
嗨,我帮你找到了问题的核心——不是main函数的结构问题,而是getNextWord()函数的实现存在严重的内存错误,直接导致了段错误,下面我一步步给你拆解:
核心问题:返回临时对象的引用导致悬垂引用
看你parse_text.c里的getNextWord()实现:
const std::pair<std::string, bool>& ParseText::getNextWord() const { if(currentWord >= words.size()) { return std::make_pair(std::string(), true); } ++currentWord; bool isLastWord = (currentWord == words.size() - 1); auto it = words.begin(); std::advance(it, currentWord); return std::pair(*it, isLastWord); }
这里的两处return都是返回临时std::pair对象的引用——临时对象在函数执行完毕后会立即被销毁,此时返回的引用就变成了"悬垂引用"(指向已经被释放的内存)。当你在main函数里访问这个引用时,操作系统就会触发段错误来阻止非法内存访问。
解决方案(不修改函数签名的前提下)
因为你说不能修改函数的声明(必须返回const std::pair<std::string, bool>&),那我们可以通过在类中添加一个成员变量来存储结果,避免返回临时对象:
修改
parse_text.h,添加成员变量
在ParseText类里新增一个mutable的成员变量(因为getNextWord()是const函数,要修改成员必须用mutable标记):class ParseText { std::list<std::string> words; std::ifstream file; static int currentWord; mutable std::pair<std::string, bool> nextWordResult; // 新增这个成员 // 其他已有成员... };修改
getNextWord()的实现
不再返回临时对象,而是更新成员变量后返回它的引用:const std::pair<std::string, bool>& ParseText::getNextWord() const { if(currentWord >= words.size()) { nextWordResult = std::make_pair(std::string(), true); return nextWordResult; } ++currentWord; bool isLastWord = (currentWord == words.size() - 1); auto it = words.begin(); std::advance(it, currentWord); nextWordResult = std::make_pair(*it, isLastWord); return nextWordResult; }
额外的逻辑小问题(解决段错误后需要注意)
你的main函数循环逻辑会漏掉最后一个单词:
- 当
getNextWord()返回最后一个单词时,wordInfo.second为true,会直接break,导致这个单词没有被添加到计数器里。
可以调整循环逻辑,先处理单词再判断是否退出:
const std::string& firstWord = parseText.getFirstWord(); wordCounter.addWord(firstWord); while (true) { const std::pair<std::string, bool>& wordInfo = parseText.getNextWord(); // 如果已经到末尾(空字符串+true),直接退出 if (wordInfo.first.empty() && wordInfo.second) { break; } // 先添加当前单词 wordCounter.addWord(wordInfo.first); // 如果是最后一个单词,处理完再退出 if (wordInfo.second) { break; } }
备注:内容来源于stack exchange,提问作者Juze
相关产品推荐
相关产品推荐

