【发布时间】:2012-05-22 07:14:59
【问题描述】:
我正在尝试实现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实际代码吗?您需要包含所有代码。仅仅因为崩溃发生在一条线上,并不意味着这就是问题所在。 -
//更多的东西是代码,但我评论并且错误仍然存在
-
我不知道为什么,但我将内存分配器从 'new unsigned int(n)' 更改为 'malloc((n*sizeof(unsigned int))' 并且它工作得很好。任何合理的解释?
-
@RSF 您的原始问题中没有一行出现。很难诊断您没有向我们展示的代码中的问题。 (旁白:我不认为
new unsigned int(n)意味着你认为它的作用。) -
@AlanStokes 你!你说的对!匆忙是完美的敌人……
标签: c++ memory stl stack-trace push-back