2011-03-13 123 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++;),所以在函數的末尾的指針將是從由分配函數返回的一個不同。壞。

保存指針和使用保存的一個釋放內存...

2

text指向的內存,你分配與malloc()但你做text++,使其不能再執行。當您將新值傳遞給free()時,這是一個錯誤,因爲文本不再指向內存。

1

嘗試

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

之初

free(buffer); 

末,然後在中間不介意改變text