std :: bad_alloc抛出短素数程序

时间:2014-03-26 22:00:39

标签: c++ primes sieve-of-eratosthenes bad-alloc

我很快写了一个使用eratosthenes的素数的素数程序。我运行程序时得到appcrash。我调试了它,它告诉我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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

numt未初始化,这意味着它可以包含任何值,可能是一个很大的值。如果要创建该长度的向量,则会出现问题,这会导致抛出异常。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

1)你没有给numt分配一个值,但你用它来初始化向量。

2)你不在这里检查l是否超出了素数[l]的范围(如果numt等于1,该怎么办?)

for(unsigned long long l = 0; l<=sqrtt; l++) {
    if(!primes[l]) continue;
相关问题