2012-04-29 5 views
-3

이 코드는 Visual Studio 2010에 해당하는 힙 손상을 발생시킵니다. 힙 손상의 원인은 무엇입니까? 이 코드의 어떤 부분이 원인입니까?대용량 메모리 할당 크기의 힙 손상 C++

#define size 65536 
int main() 
{ 
    int* a = new int[size];//size is equal to 
    srand(time(NULL)); 
    for(int i = 0 ; i < size; i++) 
    { 
     a[i]= 1 + rand() % 10; 
    } 

    for(int i = 0; (size/2)/pow((double)2, i)>= 1; i++) 
    { 
     int n = pow((double)2, i); 
     int offset = 0; 
     for(int j = 0; j < (size/2)/pow((double)2, i); j++) 
     { 
      int* tmp = new int[n]; 
      merge(a + offset, n, a + offset + n, n, tmp); 
      memcpy(a + offset, tmp, n*2 * sizeof(int)); 
      offset += pow((double)2, i+1); 
     } 
    } 

    for(int i = 0; i < size; i++) 
    { 
     cout<<a[i]<<" "; 
    } 
    cout<<endl; 
    system("PAUSE"); 
    return 0; 
} 
+1

'병합'이란 무엇입니까? –

+2

또한 메모리 누수가 있습니다. 'tmp'가 가리키는 메모리를 결코 해제하지 않습니다. –

+0

공극 병합 (INT * A, INT의 a_size, INT의 * B를 INT의 b_size, INT의 * 온도) (INT A_I = 0, b_i = 0, C_I = 0; C_I Nashwan

답변

3

의심되는 memcpy가 문제입니다. tmp로부터 (n * 2 * sizeof (int)) 바이트를 복사하고 n * sizeof (int) 만 할당했다.

1

힙 손상은 단순히 메모리의 blcok을 할당 한 다음 해당 블록 외부에 기록 된 데이터를 의미합니다. 일반적으로 이는 배열의 끝을 지나서 작성되었음을 의미합니다.

소량의 덮어 쓰기는 메모리 할당 후에 배치되는 "보호 단어"에 영향을 미치므로 런타임은 프로그램이 계속 실행되는 동안 ANBD 보고서 힙 손상을 감지합니다. 그러나 추가로 작성하면 중요한 데이터가 손상되어 프로그램에서 데이터를 사용하려고 할 때 정의되지 않은 결과가 발생하거나 메모리 맵이 끝나서 치명적인 액세스 위반 오류가 발생할 수 있습니다. 당신이 사용하는 최대 인덱스가 될 것입니다 무엇을 계산할 수없는 경우 배열에 인덱스가 범위에 항상 것을

확인 0 ..-1

하고 있는지 확인하는 코드의 라인을 넣어 인덱스가이 범위 내에 있고 그렇지 않은 경우 디버거로 침입합니다. 즉 merge/memcpy에 전달할 값이 항상 범위 내에 있는지 확인하십시오. (한 가지 요소를 너무 많이 쓰는 기회 일 수 있습니다. 즉, "필요한 것"보다 조금 더 많은 메모리를 할당하는 것이 가장 빠를 수 있지만 분명히 올바른 해결책은 아닙니다. 의도 한 데이터 만 쓰도록해야합니다.

1

)에 당신은 tmp을위한 충분한 공간을 할당하지 않은 :

int* tmp = new int[2*n]; 

병합 코드 for (..; ...; c_i++)의 증분도 매우 의심스러운.

아마도 디버그를 사용하거나 추적 메시지를 작성하고 무슨 일이 일어나고 있는지 확인할 수 있습니다. 경계를 벗어나지 않았는지 확인하십시오.

+0

아니요 ... 고맙습니다. – Nashwan