我正在尝试实现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
任何想法?
答案 0 :(得分:4)
从您的评论中可以清楚地看出:访问unsigned int *x
是您在radix
功能中访问时出现无效写入错误的原因。
unsigned int *x = new unsigned int(n);
分配单个 unsigned int并为其分配值n
。你真的想要一个无符号整数数组:
unsigned int *x = new unsigned int[n];
通常,运行Valgrind有助于发现内存泄漏以及问题所在。因为,通常您收到的错误消息几乎不会发生在出现的行中。