std :: bad_alloc в коротких простых программах

Я быстро написал программу простых чисел, в которой используется набор эратосфенов. Я получаю 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;
}

Пожалуйста, также сообщите мне о любых плохих практиках программирования, пожалуйста.

0

Решение

1) Вы не присваивали numt значение, но используете его для инициализации вектора.

2) Здесь вы не проверяете, находится ли l вне границ для простых чисел [l] (что если numt равно 1?):

for(unsigned long long l = 0; l<=sqrtt; l++) {
if(!primes[l]) continue;
1

Другие решения

Очень плохая практика: компиляция вашего кода без всех разумных предупреждений компилятора или игнорирование предупреждений компилятора.

Переменная numt не имеет определенного значения. поэтому простые простые числа (numt) потерпят неудачу.

2

numt не инициализируется, что означает, что он может иметь любой значение, вероятно, большое. Это проблематично, если вы хотите создать вектор такой длины, который вызывает исключение.

2

Ты не пишешь numt так что вы, вероятно, получите какую-то смехотворно большую стоимость мусора. Когда линия vector<bool> primes(numt) оценивается, он пытается создать смехотворно огромный динамический массив, используя значение мусора, которое ваша ОС не может сделать из-за чрезмерного размера.

2
По вопросам рекламы [email protected]