Я пытался решить проблему с литкодом 204 (количество простых чисел меньше n), и я продолжаю получать ошибку «использование кучи после освобождения». Мое решение ниже. Я добавил несколько операторов печати, чтобы получить некоторое представление о том, что происходит, но на самом деле это не помогает.
#include <iostream>
#include <vector>
using namespace std;
int countPrimes(int n) {
if (n < 2) return 0;
vector<int> primes;
primes.push_back(2);
for (int m = 3; m < n; m++) {
cout << "m = " << m << endl;
for (auto it = primes.begin(); it < primes.end(); it++) {
cout << *it << ", ";
}
cout << endl;
bool prime = true;
for (int d : primes) {
cout << "d = " << d << endl;
if (m % d == 0) {
prime = false;
break;
}
cout << "end m = " << m << endl;
if (prime) primes.push_back(m);
}
}
return primes.size();
}
int main() {
cout << countPrimes(9) << endl;
}
Выводы на печать:
m = 3
2,
d = 2
end m = 3
m = 4
2, 3,
d = 2
m = 5
2, 3,
d = 2
end m = 5
d = 0
exit status -1
Любые идеи, что я делаю неправильно. Это заставляет меня думать, что у меня какое-то фундаментальное непонимание того, что я делаю...





Проблема здесь
bool prime = true;
for (int d : primes) {
...
if (prime) primes.push_back(m);
}
Вы не можете использовать диапазон, основанный на цикле for для вектора, если цикл также изменяет размер вектора. Диапазон, основанный на циклах for, зависит от итераторов вектора, и все итераторы вектора становятся недействительными, если к вектору добавляется элемент.
Конечно, вы действительно хотели написать этот код
bool prime = true;
for (int d : primes) {
...
}
if (prime)
primes.push_back(m);
что хорошо, потому что вектор изменяется после цикла, а не во время цикла.
Урок заключается в том, чтобы быть очень строгим с тем, как вы делаете отступы в коде. Неуместные строки кода легко обнаружить, если вы всегда правильно делаете отступы.
Спасибо! Я терял там рассудок. Я думаю, вы правы в том, что нужно быть строгим в отношении отступов. Это не первый раз, когда я делаю эту ошибку.