Бесплатное исключение c - PullRequest
2 голосов
/ 13 марта 2011

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

Это может быть связано с повреждением кучи, что указывает на ошибку в 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);
    }

Ответы [ 3 ]

5 голосов
/ 13 марта 2011

Вы модифицируете text (см. Строку text++;), поэтому в конце функции указатель будет отличаться от указателя, возвращаемого функцией распределения.Плохо.

Сохранить указатель и использовать сохраненный для освобождения памяти ...

2 голосов
/ 13 марта 2011

text указывает на память, которую вы выделяете с помощью malloc(), но затем вы делаете text++, так что это больше не делает. Когда вы передаете новое значение в free(), это ошибка, потому что текст больше не указывает на память.

1 голос
/ 13 марта 2011

попробуйте

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

в начале

и

free(buffer);

в конце, затем изменение text в середине не имеет значения.

...