2011-03-13 4 views
2

함수의 마지막 줄에서 예외가 발생합니다. 예외는 무료 함수와 관련이 있습니다. 여기 있습니다 : Windows가 HW1.exe에서 중단 점을 트리거했습니다.무료 예외 c

이것은 HW1.exe 또는로드 한 DLL에 버그가 있음을 나타내는 힙 손상으로 인한 것일 수 있습니다.

또한 HW1.exe에 포커스가있는 동안 사용자가 F12 키를 누르기 때문일 수 있습니다.

출력 창이 더 많은 진단 정보를 가지고있을 수 있습니다.

void unicode(HANDLE file, DWORD sizeOfFile, int N) { 
     if(sizeOfFile - 2 == 0) 
      return; 

     _TCHAR* text = (_TCHAR*)malloc(sizeOfFile); 

     DWORD numRead = 0; 

     BOOL read = ReadFile(file, text, sizeOfFile, &numRead, NULL); 
     assert(read && (sizeOfFile == numRead)); 

     int i = 0; 
     int lineNum = 0; 
     int lineStart = 0; 
     text++; 
     sizeOfFile--; 
     while(i <= sizeOfFile/2) { 
      if(i == sizeOfFile/2 && lineNum < N) 
       printLineUnicode(text + lineStart, i - lineStart, lineNum++); 


      else if(text[i] == '\r') { 
       if(lineNum < N) { 
        printLineUnicode(text + lineStart, i - lineStart, lineNum++); 
       } 
       i ++; 
       lineStart = i + 1;   
      } 

      i ++; 
     } 
     i -= 2; 

     int lineEnd = i; 
     while(i >= 0) { 
      if(i == 0 && lineNum < N) 
       printLineUnicode(text, lineEnd - i + 1, lineNum++); 

      if(text[i] == '\n') { 
       if(lineNum < 2*N) { 
        printLineUnicode(text + i + 1, lineEnd - i, lineNum++); 
        lineEnd = i - 2; 
        i --; 
       } 
      } 
      i --; 
     } 
     free(text); 
    } 

답변

5

포인터가 할당 함수에 의해 리턴 된 것과 다를 수 함수의 끝에 있도록 (라인 text++; 참조) text 수정된다. 나쁜.

저장 포인터와 ... 당신이 malloc()으로 할당하지만 당신이 그렇게 더 이상 않는다는 것을 text++을 메모리에

2

text 점을 메모리를 무료로 저장된 하나를 사용하십시오. 새 값을 free()으로 전달하면 텍스트가 더 이상 메모리를 가리 키지 않으므로 오류가 발생합니다.

1

는 상관하지 않습니다 중간에 text을 변경, 끝의 시작

free(buffer); 

에서

_TCHAR* buffer = (_TCHAR*)malloc(sizeOfFile); 
_TCHAR* text=buffer; 

을 시도합니다.