考虑以下代码段
class ItrTest {
private:
std::map<int, long> testMap;
std::map<int, long>::iterator itr;
public:
ItrTest(std::map<int, long> testMap): testMap(testMap) {
itr = testMap.begin();
}
void printNext() {
// itr = testMap.begin();
for (; itr != testMap.end(); itr++) {
cout<<"Key: "<<itr->first<<" Value:"<<itr->second<<endl;
}
}
};
int main() {
std::map<int, long> m{
{ 0, 100l },
{ 1, 200l },
{ 2, 300l },
{ 3, 400l },
{ 4, 500l },
};
ItrTest t(std::move(m));
t.printNext();
}
尝试访问迭代器中的值时,这将引发分段错误。显然发生这种情况是因为迭代器变得无效(对我而言,经过两次迭代。也许在不同的系统上它的行为有所不同)。如果我取消注释函数
printNext()
的第一行,它将正常工作。我想对此行为做一个解释。 最佳答案
在构造函数中,对于itr = testMap.begin();
,testMap
引用函数参数,而不是数据成员。离开构造函数时,销毁了itr
,它将被销毁。以后对其进行任何取消引用都将导致UB。
您可以将其更改为
itr = this->testMap.begin();
关于c++ - 将std::iterator用作类变量时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57825616/