Возникли проблемы с простым числом простых чисел - PullRequest
0 голосов
/ 08 июня 2019

Я пытался решить проблему с кодом leet 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

Есть идеи, что я делаю не так. Это заставляет меня думать, что у меня есть фундаментальное недопонимание того, что я делаю ...

1 Ответ

1 голос
/ 08 июня 2019

Проблема здесь

bool prime = true;
for (int d : primes) {
    ...
if (prime) primes.push_back(m);
}

Нельзя использовать диапазон, основанный на цикле для вектора, если цикл также изменяет размер вектора. Диапазон, основанный на циклах, зависит от итераторов к вектору, и все итераторы к вектору становятся недействительными, если в вектор добавляется элемент.

Конечно, вы действительно хотели написать этот код

bool prime = true;
for (int d : primes) {
    ...
}
if (prime)
    primes.push_back(m);

, что хорошо, потому что вектор изменяется после цикла, а не во время цикла.

Урок должен быть очень строгим с тем, как вы делаете отступ для кода. Неправильные строки кода легко обнаружить, если всегда правильно делать отступы.

...