2012-05-14 2 views
3

나는 radix sort을 구현하기 위해 노력하고있어,이 코드는 메모리 오류 발생 다음 크기 :메모리 오류 : 무료() : 무효 (빠른)

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; 
} 
:

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

코드는 다음과 같다

GDB는 오류가와 push_back 내부한다고하지만, elem은 (nx[]의 크기입니다) n 항상보다 작다. 그래서 나는 그것이 단지 bucket_num 일 수 있다고 생각했습니다.

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 

아이디어 : 그러나, 충돌 직전에 GDB 나에게 그 값을 준다?

+1

은'// 더 많은 것들'실제 코드입니까? 모든 코드를 포함해야합니다. 충돌이 라인에 있었기 때문에 그것이 문제가있는 곳을 의미하지는 않습니다. – SoapBox

+0

// 코드가 더 많았지 만 주석이 달렸고 오류가 남아 있습니다 – RSFalcon7

+0

이유는 모르겠지만 메모리 할당자를 'new unsigned int (n)'에서 'malloc (n * sizeof (unsigned int))'으로 변경했습니다. '그리고 그것은 정상적으로 작동합니다. 합리적인 설명은 무엇입니까? – RSFalcon7

답변

4

귀하의 의견에 따르면 unsigned int *x에 액세스하면 radix 기능에서 액세스 할 때 잘못된 쓰기 오류가 발생합니다.

unsigned int *x = new unsigned int(n); 부호없는 정수를 할당하고 값 n을 할당합니다. 일반적으로 unsigned int *x = new unsigned int[n];

Valgrind를 통해 실행하면 메모리 누수와 정확히 어디에 문제가 거짓말을 찾을 수 있습니다 : 당신은 정말 부호없는 int 배열을 원했다. 종종, 오류 메시지는 이 나타나는 행에서 거의 발생하지 않으므로이 표시됩니다.