Я пытаюсь реализовать 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
любые идеи?
является фактическим кодом '// more stuff'? Вам нужно включить весь код. Просто потому, что авария была на линии, не означает, что это проблема. – SoapBox
// больше материала было кодом, но я комментирую, и ошибка остается – RSFalcon7
Я понятия не имею, почему, но я изменил распределитель памяти из 'new unsigned int (n)' в 'malloc ((n * sizeof (unsigned int)) 'и он отлично работает. Любое разумное объяснение? – RSFalcon7