2011-03-13 122 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