运行大小[6,10,14,...]时,为什么此代码会中止

时间:2012-09-30 08:49:04

标签: c++ sigabrt sieve-of-eratosthenes

这是我为实现Sieve of Eratosthenes而编写的一些代码:

#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 个答案:

答案 0 :(得分:3)

下面:

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

您允许index最多运行n,这超出了界限。您需要n-1while (index < n)。代码中还有其他类似的索引错误,所有这些都会导致未定义的行为。