循环重复16次后的以下代码segfault。当使用gdb调试时,*col
等于"a",除非在迭代中出现segfault,在迭代中它突然变为"\036"。这在WSL Debian上的gcc 6.30和clang 3.8.1上都进行了测试。
这个错误的原因可能是什么?
#include <iostream>
#include <string>
int main(void) {
std::string line = "";
std::string::iterator col = line.begin();
for (int i = 0;; i++) {
std::cout << line << std::endl;
std::cout << i << std::endl;
line.insert(col, 'a');
}
}
编辑:是的,有一个无限循环,我知道这一点。这只是为了MCVE。
在字符串中插入元素后,字符串可能会重新定位自己,然后迭代器将不会指向字符串的开头,它将无效。
所以做这个
#include <iostream>
#include <string>
int main() {
std::string line = "";
std::string::iterator col = line.begin();
for (int i = 0;; i++) {
std::cout << line << std::endl;
std::cout << i << std::endl;
line.insert(col, 'a');
col = line.begin();
}
}
请注意,这只修复了迭代器问题,但无限循环将无限扩展字符串,直到程序崩溃。