2012-05-14 3 views
3

Я пытаюсь реализовать radix sort, и этот код производит сбой памяти:Ошибка памяти: свободный(): недопустимый следующий размер (быстро)

(free(): invalid next size (fast)) 

Код следующее:

unsigned int * radix(unsigned int *x,int n, int g,bool verbose) 
{ 
    int elem_size = sizeof(unsigned int)*8; 
    int mask = ((1<<g)-1);  
    float num_rounds= ((float)elem_size/(float)g); 
    int B = 1 << g; // 2^g BTW 

    vector<unsigned int> buckets[B]; 

    // begin radix sort 
    for(unsigned int round=0 ; round<num_rounds ; ++round) 
     { 

     // count 
     for(int elem=0 ; elem<n ; ++elem) 
     { 
      // calculate the bucket number: 
      unsigned int const bucket_num = (x[elem] >> g*round) & mask; 
    --->  buckets[bucket_num].push_back(x[elem]); 
     } 
     // more stuff 
    } 
    return x; 
} 

GDB утверждает, что ошибка находится внутри push_back, но elem всегда меньше n (где n является размер x[]). Итак, я думал, что это может быть только на bucket_num. Однако, как раз перед он выходит из строя GDB дает мне их значения:

Breakpoint 1, radix (x=0x604010, n=50, g=4, verbose=true) 
    at radix.mpi.seq.cpp:38 
38    buckets[bucket_num].push_back(x[elem]); 
2: B = 16 
1: bucket_num = 2 

любые идеи?

+1

является фактическим кодом '// more stuff'? Вам нужно включить весь код. Просто потому, что авария была на линии, не означает, что это проблема. – SoapBox

+0

// больше материала было кодом, но я комментирую, и ошибка остается – RSFalcon7

+0

Я понятия не имею, почему, но я изменил распределитель памяти из 'new unsigned int (n)' в 'malloc ((n * sizeof (unsigned int)) 'и он отлично работает. Любое разумное объяснение? – RSFalcon7

ответ

4

Из вашего комментария ясно, что: доступ к unsigned int *x является причиной ошибочной ошибки записи, которую вы получаете при доступе к ней в своей функции radix.

unsigned int *x = new unsigned int(n); присваивает одиночный неподписанный int и присваивает ему значение n. Вам действительно нужен массив без знака ints: unsigned int *x = new unsigned int[n];

В общем, прохождение через Valgrind помогает найти утечки памяти и где именно лежит проблема. Потому что, часто сообщение об ошибке, которое вы получаете, едва ли происходит в строке, где появляется .