内存错误: free(): 下一个大小无效 (快速)

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

本文关键字:无效 快速 下一个 错误 内存 free      更新时间:2023-10-16

我正在尝试实现一个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(其中nx[]的大小(。所以,我认为它只能在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

有什么想法吗?

从您的评论中可以清楚地看出:访问unsigned int *x是在radix函数中访问它时出现无效写入错误的原因。

unsigned int *x = new unsigned int(n);分配单个无符号 int 并将值n分配给它。你真的想要一个无符号的整数数组: unsigned int *x = new unsigned int[n];

通常,运行Valgrind有助于找到内存泄漏以及问题的确切位置。因为,通常您收到的错误消息几乎不会发生在似乎发生的行中。