【问题标题】:Segfault when inserting with iterator使用迭代器插入时的段错误
【发布时间】:2020-07-02 03:28:18
【问题描述】:

以下代码在循环重复 16 次后出现段错误。使用 gdb 进行调试时,*col 等于 'a',除非在迭代中出现段错误,此时它突然变为 '\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。

【问题讨论】:

  • 修复此迭代器问题后,您会看到这也是一个无限循环,会填满string,直到程序崩溃。不过你可能已经知道了。
  • 是的,无限循环只是用于stackoverflow的示例。

标签: c++ string iterator segmentation-fault


【解决方案1】:

在你的字符串中插入元素后,字符串可能会重新分配自己,然后你的迭代器将不会指向你的字符串的开头并且它不会是有效的。

那就这样吧

#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();
    }
}

请注意,这仅修复了迭代器问题,但您的无限循环将无限扩展您的字符串,直到您的程序崩溃。

【讨论】:

  • 我应该怎么做?存储索引而不是迭代器?
  • 是的,看看function overloadsinsert。您可以完全避免使用 begin() 迭代器,而只使用函数的 basic_string&amp; insert( size_type index, size_type count, CharT ch ); 版本。喜欢line.insert(0, 1, 'a');
  • 这是否也适用于向量等其他容器的迭代器?
  • @SuperStormer 是的
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多