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
什麼想法?
是「//更多東西」的實際代碼嗎?你需要包含所有的代碼。只是因爲撞車事故,並不意味着問題出在哪裏。 – SoapBox
//更多的東西是代碼,但我的評論和錯誤仍然 – RSFalcon7
我不知道爲什麼,但我改變了內存分配從'新的unsigned int(n)'到'malloc((n * sizeof(unsigned int)) '並且它工作得很好 任何合理的解釋? – RSFalcon7