调用free会导致程序抛出异常

时间:2011-10-10 19:07:45

标签: c windows multithreading api free

当我偶然发现以下问题时,我正在做作业。我应该在C中使用Windows API函数创建一个简单的多线程应用程序。每个线程都会运行一个简单的任务,所以我决定回收一些旧的东西。

我有一个头文件:

http://pastebin.com/1aJFAwBg

源文件:

http://pastebin.com/L127FGhG

然后在main中,我进行以下调用:

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

LoadPoem打开包含原始文件的文件,为输入分配一个缓冲区(变量loadedPoemBuffer)并将文件中的文本存储在其中。然后,ProcessPoem为更改后的版本(变量processedPoemBuffer)分配一个缓冲区,并通过重复调用strtok来填充它。然后它释放loadedPoemBuffer并结束。 到现在为止还挺好。 当我调用SavePoem()时,问题就出现了,它正确地保存了数据,但是当它结束时,它调用free(processedPoemBuffer)并抛出异常 - 损坏的堆。我似乎无法理解为什么。在我看来,它与之前的ProcessPoem完全相同,但该功能不会失败。

有人可以向我解释一下吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

processedPoemBuffer似乎是LPWSTR,这意味着您的数据是Unicode。然后你调用_tcscat_s,如果你正在构建Unicode,则需要字符数,而不是字节数。您需要将输入文件大小除以_tcscat_s缓冲区长度参数的WCHAR大小。

答案 1 :(得分:-1)

free中的例外情况意味着您使用的内容不是malloc的结果。使用NULL初始化processedPoemBuffer并在free处检查:

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