2011-03-13 3 views
2

Я получаю исключение в последней строке функции, исключение, которое связано с бесплатным. Вот он: Windows вызвала точку останова в файле HW1.exe.Бесплатное исключение c

Это может быть связано с повреждением кучи, что указывает на ошибку в HW1.exe или на любую из загруженных DLL-файлов.

Это может быть связано с нажатием кнопки F12, когда HW1.exe имеет фокус.

Выходное окно может содержать больше диагностической информации.

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 в середине не возражает.

Смежные вопросы