【问题标题】:Memory error: free(): invalid next size (fast)内存错误:free():下一个大小无效(快速)
【发布时间】: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(其中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

有什么想法吗?

【问题讨论】:

  • //more stuff 实际代码吗?您需要包含所有代码。仅仅因为崩溃发生在一条线上,并不意味着这就是问题所在。
  • //更多的东西是代码,但我评论并且错误仍然存​​在
  • 我不知道为什么,但我将内存分配器从 'new unsigned int(n)' 更改为 'malloc((n*sizeof(unsigned int))' 并且它工作得很好。任何合理的解释?
  • @RSF 您的原始问题中没有一行出现。很难诊断您没有向我们展示的代码中的问题。 (旁白:我不认为new unsigned int(n) 意味着你认为它的作用。)
  • @AlanStokes 你!你说的对!匆忙是完美的敌人……

标签: c++ memory stl stack-trace push-back


【解决方案1】:

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

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

一般来说,通过Valgrind 运行有助于发现内存泄漏以及问题所在。因为,您收到的错误消息通常几乎不会发生在它似乎发生的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 2012-10-25
    • 2017-03-28
    • 2018-05-20
    • 1970-01-01
    • 2015-04-16
    • 2012-11-14
    相关资源
    最近更新 更多