Я быстро написал программу простых чисел, в которой используется набор эратосфенов. Я получаю 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;
}
Пожалуйста, также сообщите мне о любых плохих практиках программирования, пожалуйста.
1) Вы не присваивали numt значение, но используете его для инициализации вектора.
2) Здесь вы не проверяете, находится ли l вне границ для простых чисел [l] (что если numt равно 1?):
for(unsigned long long l = 0; l<=sqrtt; l++) {
if(!primes[l]) continue;
Очень плохая практика: компиляция вашего кода без всех разумных предупреждений компилятора или игнорирование предупреждений компилятора.
Переменная numt не имеет определенного значения. поэтому простые простые числа (numt) потерпят неудачу.
numt
не инициализируется, что означает, что он может иметь любой значение, вероятно, большое. Это проблематично, если вы хотите создать вектор такой длины, который вызывает исключение.
Ты не пишешь numt
так что вы, вероятно, получите какую-то смехотворно большую стоимость мусора. Когда линия vector<bool> primes(numt)
оценивается, он пытается создать смехотворно огромный динамический массив, используя значение мусора, которое ваша ОС не может сделать из-за чрезмерного размера.