ошибка двойного освобождения от set :: erase - PullRequest
0 голосов
/ 23 февраля 2020

Я получаю ошибку времени выполнения double free or corruption (!prev). Я потратил некоторое время, пытаясь что-то сделать, и думаю, что смогу придумать меньший воспроизводимый пример.

Этот код выдает похожую ошибку «двойного освобождения». Что тут происходит? Я думал set::erase увеличивает итератор.

#include <iostream>
#include <set>
#include <string>

int main() {

    std::set<int> tmp = {1,2,3};
    for(auto num = tmp.begin(); num != tmp.end(); ) {
        if(true) {
            std::cout << "removing...\n";
            tmp.erase(num);
        }
    }

    return 0;
}

1 Ответ

1 голос
/ 23 февраля 2020

Я думал, что set :: erase увеличивает итератор.

Он не увеличивает итератор. Возвращает следующий итератор. После удаления итератор num становится недействительным. Действительный код выглядит следующим образом.

for(auto num = tmp.begin(); num != tmp.end(); ) {
    if(true) {
        std::cout << "removing...\n";
        num = tmp.erase(num);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...