2013-06-08 2 views
3

삭제 [] 명령에서 힙 손상 오류가 발생했습니다. 프로젝트는 VC++ 2008에서 이루어졌으며 그 요구 사항 (그래서 집중하지 마세요). 건물 전체 프로세스가 확인 작업을하지만, 런타임에 내가 오류 :삭제시 힙 손상 []

Windows has triggered a breakpoint in prs_2013.exe.

This may be due to a corruption of the heap, which indicates a bug in prs_2013.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while prs_2013.exe has focus.

The output window may have more diagnostic information.

이 오류가 전체 프로젝트의 그것의 단지 일부를 발생 코드는하지만, 오류가 제한됩니다 (prs_2013 내 프로젝트의 이름입니다) 이 지역에서 : 나는 delete[] temp;delete[] x0_coef;을 전환하는 경우

// Function used for swapping row of matrix with new values 
void Main::swap(double* matrix, double* row, unsigned index, unsigned size){ 
    double temp = 0; 
    for(unsigned i = 0; i < size; i++){ 
     temp = matrix[i*size + index]; 
     matrix[i*size + index] = row[i]; 
     row[i] = temp; 
    } 
} 

// Function that do some calculations, not really relevant for this problem 
    // but still used in code 
double Main::determinat(double* matrix, unsigned size){ 
    double ud = 0, du = 0; 
    for(unsigned j = 0; j < size; j++){ 
     double ude = 1, due = 1; 
     for(unsigned i = 0; i < size; i++){ 
      ude *= matrix[i*size + (i+j)%size]; 
      due *= matrix[(size-i)*size + (i + j)%size]; 
     } 
     ud += ude; 
     du += due; 
    } 
    return ud - du; 
} 

// Function in which error occurs 
double* Main::get_x(double* matrix, unsigned size){ 
     // error checking 
    if(size == 1){return NULL;} 

    double *x = new double[size]; 
    x[0] = 1; 
    unsigned const temp_size = size-1; 

    double *temp = new double[temp_size * temp_size]; // temporary matrica  

    double *x0_coef = new double[temp_size]; // variable on which error occures 

    for(unsigned i = 0; i < temp_size; i++) 
     x0_coef[i] = matrix[i*size + 0]/s[0];  // s is class member, init in constructor s[0] != 0 

    for(unsigned i = 1; i < size; i++) 
     for(unsigned j = 1; j < size; j++) 
      if(i == j) 
       temp[(i-1)*size + j-1] = (matrix[i*size + j] - 1)/s[i]; 
      else 
       temp[(i-1)*size + j-1] = matrix[i*size + j]/s[i]; 

    double deltaS = determinat(temp, temp_size);  // delta of system 
    for(unsigned i = 0; i < temp_size; i++){ // delta of vars 
     swap(temp, x0_coef, i, temp_size); 
     x[i+1] = determinat(temp, temp_size)/deltaS; 
     swap(temp, x0_coef, i, temp_size); 
    } 

    delete[] x0_coef; // place where error occures 
    delete[] temp; 
    return x; 
} 

그러나 같은 일이 발생, 오류가 온도에서 발생;

코드에서 볼 수 있듯이 char, 즉 ie를 사용하지 않습니다. 0을 여전히 유효한 값이므로 '\ 0'을 (를) 추가하는 것은 쓸모가 없습니다.

하지만 지금은 흥미로운 부분,이 코드와 스왑 기능을 테스트 한 :

#include <iostream> 
using namespace std; 

void swap(double* a, double* b, unsigned size){ 
    double temp = 0; 
    for(unsigned i=0; i < size; i++){ 
     temp = a[i]; 
     a[i] = b[i]; 
     b[i] = temp; 
    } 
} 

void main(){ 
    double *a = new double[5], 
       *b = new double[5]; 
    for(unsigned i=0; i < 5; i++){ 
     a[i] = i; 
     b[i] = i*i; 
    } 

    swap(a, b, 5); 

    for(unsigned i=0; i < 5; i++) 
     std::cout << "a: " << a[i] << " b: " << b[i] << endl; 

    delete[] a; 
    delete[] b; 

    system("PAUSE"); 

} 

그리고 모든했다.

솔직히 말하면 나는 지혜가 끝나고, 2-3 일 동안 내가 빠진 것이 무엇인지 알아 내려고 노력했습니다. 그러나 대부분의 다른 주제는 문자 배열, 문자열 및 배열 길이의 일반적인 계산 실패와 관련이 있습니다. 그리고 코드에서 볼 수 있듯이 항상 배열 길이를 다른 함수로 전달합니다.

내가해야 할 일을하는 데 더 나은 코드가있을 것이라고 확신하지만이 기능은 솔로가 필요한 프로젝트이므로 배열과 관련하여 잘못된 것을 확인하는 데 도움이됩니다. .

+1

이것은 원시 포인터 'new'와'delete' (또는 배열 대응)로 수동 메모리 관리를 할 때 일어나는 일입니다. 대신'std :: vector'와 같은 RAII 래퍼를 사용할 것을 제안합니다. Boost에는 다차원 배열을위한 클래스도 있습니다. –

+3

이것은 원시 포인터를 사용하여 잘못된 메모리 관리를 할 때 발생하는 일종의 것입니다. – Inspired

+0

제가 이미 lib 디렉토리를 만들었지 만,이 프로젝트에 대한 요구 사항을 벗어났습니다. , , 을 제외한 다른 lib는 사용할 수 없습니다. 나는 정말로 당신을 보여주지 못한다. 그러나 나는 심지어 링크드리스트와 라운드 버퍼를 구현했다. 그리고 이런 종류의 일은 내가 잠을 자지 않고 2 일 동안 전체 프로젝트를하려고 할 때 발생합니다. – Igor

답변

7

배열 temp의 범위를 벗어나는 인덱스에 쓸 때 코드가 메모리를 손상시킵니다. 힙이 손상되면 아무 일도 일어나지 않습니다 (예 : delete[] 호출시).

귀하의 temp 배열은 이중 루프 내부 size*(size-1) 배열로 처리하는 동안, (size-1)*(size-1) 항목이 포함 temp[(i-1)*size + j-1] = ... (당신이 size으로 "최초의 인덱스"를 곱하기 때문에).

temp[(i-1)*temp_size + j-1]으로 바꾸면 문제가 해결 될 것입니다.

+0

고맙습니다. 나는 모니터를 10 시간 동안 쳐다 보지 못했습니다. 테스트 코드에서 복사/붙여 넣기로 인해 오류가 발생했습니다. – Igor

+0

chime에 들어가기를 원했고,'delete'시 런타임 오류가 발생했지만 오류 메시지는 표시되지 않았습니다. 이것이 원인이라는 것을 알기까지는 어느 정도 시간이 걸렸습니다. 일부 배열에서는 메모리를 거의 할당하지 않고 범위를 벗어난 인덱스를 사용했습니다. –