Звонок на бесплатную заставляет программу бросить исключение - PullRequest
1 голос
/ 10 октября 2011

Я делал домашнее задание, когда наткнулся на следующую проблему.Я должен создать простое многопоточное приложение, использующее в C и использующее функции Windows API.Каждый поток будет выполнять простую задачу, поэтому я решил переработать некоторые старые вещи, которые я сделал.

У меня есть файл заголовка:

http://pastebin.com/1aJFAwBg

И источникfile:

http://pastebin.com/L127FGhG

Затем в main я делаю следующий вызов:

LoadPoem();
ProcessPoem();
SavePoem();

LoadPoem открывает файл, содержащий оригинал, выделяет буфер для ввода(переменнаяloadedPoemBuffer) и сохраняет в нем текст из файла.Затем ProcessPoem выделяет буфер для измененной версии (переменная processingPoemBuffer) и заполняет его, многократно вызывая strtok.Затем он освобождает загруженный PoeBuffer и заканчивается.Все идет нормально.Проблема возникает, когда я вызываю SavePoem (), он корректно сохраняет данные, но когда он заканчивается, он вызывает free (processingPoemBuffer) и выбрасывает исключение - поврежденная куча.Я не могу понять, почему.Мне кажется, что он выполняет точно такую ​​же операцию, что и ProcessPoem до этого, но эта функция не дает сбоя.

Может кто-нибудь объяснить мне это?Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

processingPoemBuffer выглядит как LPWSTR, что означает, что ваши данные в Unicode.Затем вы вызываете _tcscat_s, который, если вы создаете Unicode, ожидает количество символов, а не байтов.Вам необходимо разделить размер входного файла на размер WCHAR для аргумента длины буфера _tcscat_s.

0 голосов
/ 10 октября 2011

Исключение в free означает, что вы называете это чем-то, что не является результатом malloc. Начните свой processedPoemBuffer с NULL и проверьте его на free:

void* processedPoemBuffer = NULL;
...
if (some_err) goto error;
... 
error:
if (processedPoemBuffer) // only delete checks for NULL
    free(processedPoemBuffer);
...