C++ 对小于n的简单计数素数有问题

C++ 对小于n的简单计数素数有问题,c++,primes,heap-corruption,C++,Primes,Heap Corruption,我一直在尝试leetcode问题204(计数小于n的素数),我不断得到一个“释放后使用堆”错误。我的解决方案如下。我添加了一些打印语句,以了解正在发生的事情,但这并没有真正起到帮助作用 #include <iostream> #include <vector> using namespace std; int countPrimes(int n) { if (n < 2) return 0; vector<int> primes; pr

我一直在尝试leetcode问题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;

}
知道我做错了什么吗。这让我觉得我对自己正在做的事情有一些基本的误解…

问题就在这里

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);
这很好,因为向量是在循环之后修改的,而不是在循环期间


这一课是对代码缩进的严格要求。如果你总是正确缩进,错放的代码行很容易被发现。

谢谢!我在那里发疯了。我认为你对缩进要求严格是对的。这不是我第一次犯这样的错误。
bool prime = true;
for (int d : primes) {
    ...
}
if (prime)
    primes.push_back(m);