当我偶然发现以下问题时,我正在做作业。我应该在C中使用Windows API函数创建一个简单的多线程应用程序。每个线程都会运行一个简单的任务,所以我决定回收一些旧的东西。
我有一个头文件:
源文件:
然后在main中,我进行以下调用:
LoadPoem();
ProcessPoem();
SavePoem();
LoadPoem打开包含原始文件的文件,为输入分配一个缓冲区(变量loadedPoemBuffer)并将文件中的文本存储在其中。然后,ProcessPoem为更改后的版本(变量processedPoemBuffer)分配一个缓冲区,并通过重复调用strtok来填充它。然后它释放loadedPoemBuffer并结束。 到现在为止还挺好。 当我调用SavePoem()时,问题就出现了,它正确地保存了数据,但是当它结束时,它调用free(processedPoemBuffer)并抛出异常 - 损坏的堆。我似乎无法理解为什么。在我看来,它与之前的ProcessPoem完全相同,但该功能不会失败。
有人可以向我解释一下吗?提前谢谢。
答案 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);