Почему этот код прерывается при запуске для размеров [6, 10, 14, …]

Это код, который я написал для реализации Сито Эратосфена:

#include <iostream>
#include <vector>
#include <cmath>
#include <cassert>
#include <cstdlib>

int allPrimes (unsigned long n) {
std::vector<int> track (n, 0);
int index = 2;
int m = sqrt(n);
while(index < n) {
if (track[index] == 0) {
std::cout << index << std::endl;
int mul = 1;
while ((index <= m) && (n >= (index * ++mul))) {
track[index * mul] = 1;
}
}
index++;
}
}

int main() {
int num;
std::cin >> num;
allPrimes(num);
}

Странно, когда бы num находится в серии 6, 10, 14, 18, 22, … код прерывается со стеком folloiwng при освобождении памяти (работает нормально для других n):

raise () from /lib64/libc.so.6
abort () from /lib64/libc.so.6
__libc_message () from /lib64/libc.so.6
malloc_printerr () from /lib64/libc.so.6
_int_free () from /lib64/libc.so.6
__gnu_cxx::new_allocator<int>::deallocate
std::_Vector_base<int, std::allocator<int> >::_M_deallocate
std::_Vector_base<int, std::allocator<int> >::~_Vector_base
std::vector<int, std::allocator<int> >::~vector
allPrimes (n=6) at allprimes.cpp:20
main () at allprimes.cpp:26

Но я не вижу ошибки или логики этих чисел, разделенных 4. Что за ошибка здесь?

1

Решение

Вот:

while(index <= n) {
if (track[index] == 0) {

вы позволяете index подбегать к n, который находится за пределами. Тебе нужно n-1, или же while (index < n), В коде есть и другие подобные ошибки индексации, которые приводят к неопределенному поведению.

3

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

Других решений пока нет …

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