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

何か案は?

4

1 に答える 1

4

あなたのコメントから、それは明らかです:アクセスunsigned int *xはあなたがあなたの関数でそれにアクセスするときにあなたが得る無効な書き込みエラーの理由ですradix

unsigned int *x = new unsigned int(n);単一のunsignedintを割り当て、それに値を割り当てますn。あなたは本当にunsignedintの配列が欲しかったのです: unsigned int *x = new unsigned int[n];

一般に、Valgrindを実行すると、メモリリークと、問題がどこにあるのかを見つけるのに役立ちます。なぜなら、エラーメッセージは、発生しているように見える行ではほとんど発生しないことが多いからです。

于 2012-05-14T19:50:24.297 に答える