当我偶然发现以下问题时,我正在做作业。我应该使用 C 和 Windows API 函数创建一个简单的多线程应用程序。每个线程都会运行一个简单的任务,所以我决定回收一些我做过的旧东西。
我有一个头文件:
还有一个源文件:
然后在 main 中,我进行以下调用:
LoadPoem();
ProcessPoem();
SavePoem();
LoadPoem 打开包含原始文件的文件,为输入分配一个缓冲区(变量 loadedPoemBuffer)并将文件中的文本存储在其中。 ProcessPoem 然后为更改后的版本(变量 processedPoemBuffer)分配一个缓冲区,并通过重复调用 strtok 来填充它。然后它释放 loadedPoemBuffer 并结束。 到目前为止,一切都很好。 当我调用 SavePoem() 时出现问题,它正确地保存了数据,但是当它结束时,它调用 free(processedPoemBuffer) 并抛出异常 - 损坏的堆。我似乎不明白为什么。在我看来,它执行的操作与之前的 ProcessPoem 完全相同,但该功能不会失败。
有人可以给我解释一下吗?提前致谢。
最佳答案
processedPoemBuffer 似乎是 LPWSTR,这意味着您的数据是 Unicode。然后你调用 _tcscat_s ,如果你正在为 Unicode 构建期望字符数,而不是字节数。您需要将输入文件大小除以 _tcscat_s 缓冲区长度参数的 WCHAR 大小。
关于调用 free 导致程序抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7717422/