2012-05-14 50 views
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 

什麼想法?

+1

是「//更多東西」的實際代碼嗎?你需要包含所有的代碼。只是因爲撞車事故,並不意味着問題出在哪裏。 – SoapBox

+0

//更多的東西是代碼,但我的評論和錯誤仍然 – RSFalcon7

+0

我不知道爲什麼,但我改變了內存分配從'新的unsigned int(n)'到'malloc((n * sizeof(unsigned int)) '並且它工作得很好 任何合理的解釋? – RSFalcon7

回答

4

根據您的評論,很明顯:訪問unsigned int *x是您在訪問radix函數時得到的無效寫入錯誤的原因。

unsigned int *x = new unsigned int(n);分配一個單個 unsigned int並將值n賦值給它。你真的想要一個無符號整型數組: unsigned int *x = new unsigned int[n];

一般來說,通過Valgrind幫助找到內存泄漏,問題出在哪裏。因爲,經常出現的錯誤信息幾乎發生在出現發生的一行。

相關問題