0

我很快写了一个使用eratosthenes 的素数程序。运行程序时出现应用程序崩溃。我调试了它,它告诉我std::bad_alloc。调试器不会告诉我发生异常的代码行,但会告诉我系统代码的哪一行。我的来源如下。我对 C++ 有点陌生。

#include <iostream>
#include <vector>
#include <string>
#include <math.h>

using namespace std;

int main(int argc, char* argv[])
{
    unsigned long long numt;
    if(argc < 2) {
        cout << "Usage: "<<argv[0]<<" <primes until...>" << endl;
        return 1;
    }

    else if(atol(argv[1])) {
        cout << "Usage: "<<argv[0]<<" <primes until...>" << endl;
        return 1;
    }
    numt = atol(argv[1]);
    vector<bool> primes(numt);

    for each(bool b in primes) b = true;

    primes[0] = false;

    long double sqrtt = sqrt(numt);
    for(unsigned long long l = 0; l<=sqrtt; l++) {
        if(!primes[l]) continue;
        for(unsigned long long cl = l; cl < numt; cl+= l) primes[cl] = false;
    }

    for(unsigned long long l = 0; l<numt; l++) if(primes[l]) cout << l;

    return 0;
}

也请告诉我任何不良的编程习惯。

4

4 回答 4

2

非常糟糕的做法:编译代码时没有打开所有合理的编译器警告,或者忽略编译器警告。

变量 numt 没有定义的值。因此向量素数 (numt) 将失败。

于 2014-03-26T22:04:36.087 回答
2

numt没有初始化,这意味着它可以有任何值,可能是一个很大的值。如果要创建该长度的向量,这是有问题的,这会导致引发异常。

于 2014-03-26T22:04:42.940 回答
2

你没有写信,numt所以你可能会得到一些可笑的巨大垃圾价值。评估该行时vector<bool> primes(numt),它会尝试使用垃圾值创建一个可笑的巨大动态数组,您的操作系统由于大小过大而无法执行此操作。

于 2014-03-26T22:04:59.010 回答
1

1)你没有给 numt 赋值,但是你用它来初始化向量。

2)您不检查 l 是否超出 primes[l] 的范围(如果 numt 等于 1 怎么办?):

for(unsigned long long l = 0; l<=sqrtt; l++) {
    if(!primes[l]) continue;
于 2014-03-26T22:04:45.997 回答