C++范围for循环中单表达式调用两函数触发段错误原因咨询
为什么范围for循环中使用
getMap()[getIndex()]会触发段错误? 问题的核心在于临时对象的生命周期和map::operator[]的行为:
临时
map对象的生命周期极短getMap()返回的是一个全新的临时map<int, set<size_t>>对象,这个对象的生命周期只局限于当前表达式的求值过程。当getMap()[getIndex()]这个表达式计算完成后,这个临时map就会被立刻销毁,它内部存储的所有set也会随之被析构、释放内存。map::operator[]返回的是依附于原map的引用
当你调用map[key]时,若键存在,它会返回对应值(也就是这里的set<size_t>)的左值引用。但这个引用的有效性完全依赖于原map的存在——一旦原map被销毁,这个引用就变成了悬空引用。范围for循环的执行逻辑放大了这个问题
范围for循环会先完成遍历范围的求值(也就是getMap()[getIndex()]),然后在整个循环过程中使用这个范围的迭代器进行遍历。但此时临时map已经被销毁,迭代器指向的是已经被释放的内存空间,后续的访问操作自然会触发段错误。
修复方案
只需要把临时map保存到一个有足够生命周期的变量中,确保它能覆盖整个循环过程:
int main(void) { auto my_map = getMap(); // 保存临时对象到局部变量,生命周期覆盖整个函数 for (const size_t &n : my_map[getIndex()]) cout << n << endl; return 0; }
这样my_map作为局部变量,会在main函数结束时才被销毁,循环中访问的set引用始终有效,就不会出现段错误了。
内容的提问来源于stack exchange,提问作者faza akbar
相关产品推荐
相关产品推荐

