Segfault при вставке с итератором - PullRequest
0 голосов
/ 21 марта 2020

Следующий код ошибки segfaults после l oop повторяется 16 раз. При отладке с помощью gdb *col равен 'a', за исключением итерации, когда происходит ошибка, в результате которой он внезапно становится '\ 036'. Это было проверено как на g cc 6.30, так и на clang 3.8.1 на Debian WSL.

Что может быть причиной этой ошибки?

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

1 Ответ

1 голос
/ 21 марта 2020

После вставки элементов в вашу строку строка может перераспределиться, и тогда ваш итератор не будет указывать на начало вашей строки, и он не будет действительным.

Так сделайте это

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

Обратите внимание, что это исправляет только проблему итератора, но ваш бесконечный l oop будет бесконечно расширять вашу строку, пока ваша программа не вылетит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...