我有一个大程序,它与以下代码的迷你版本完全相同:
#include <iostream>
#include <map>
#include <set>
using namespace std;
map<int,set<size_t>> getMap(void) {
return map<int,set<size_t>>{
{1,{2,3,4,5}},
{2,{3,4,5,6}}
};
}
int getIndex(void) {
return 1;
}
int main(void) {
for (const size_t &n: getMap()[getIndex()])
cout << n << endl;
return 0;
}
我得到的结果是分段错误。我在这里犯了错误,但不知道错误到底在哪里。
getMap()[getIndex()])
是我认为错误的表达方式。但我相信表达式应该返回一个容器set<size_t>
,我可以迭代它。
有人可以解释为什么在一个表达式中调用这些函数会在上述代码中产生分段错误吗?我是否尝试访问不应该访问的内容?或者我错过了编译器在处理这样的表达式时的行为?
您的
getMap
函数返回映射的实例,但在基于范围的 for
循环中,:
右侧的实体必须在整个循环运行过程中持续存在。
在您的情况下,
getMap()
返回的地图将不再存在于第二次迭代中。
解决方法是将
getMap()
的返回值分配给一个变量,该变量将保留在基于范围的 for
范围内:
int main(void) {
auto m = getMap()[getIndex()]; // assign to a variable that will not be destroyed.
for (const size_t &n : m)
cout << n << endl;
return 0;
}