我如何知道何时应该释放库函数返回的C中的字符串?

我应该使用free() ¹自己在C中释放哪些字符串?

我的知识状态:

  • char a[256]; :不
  • char *a = "abcdefg"; :不
  • char *a = malloc(15L); :是的
  • getenv()返回的字符串: no
  • Windows函数返回的字符串²:???

¹或LocalFree() / GlobalFree() / VirtualFree()
²特别是GetCommandLineW()

对于您使用的任何返回字符串的API(或大于单个简单值的其他数据,如整数),将始终在文档中提及此内容。

是的,这意味着您必须彻底阅读所有此类API函数的文档,以便跟踪并且不会泄漏内存。

必须free d的唯一内存块是之前已经过malloc

现在的问题是“这个指针是指向malloc创建的malloc的指针吗?” 并且,如果是这样,“我应该自己解放它还是其他function会照顾它?”

这些问题没有简单的答案,通常文档会告诉你,但经验法则是负责内存创建的模块也负责解除分配。 因此,如果您使用的库希望您提供已分配的内存,那么您也应该在需要时释放它。

在显式动态分配的情况下,即malloc/alloc/realloc您必须明确free它。 但是现在您已经提到了字符串,有一个特殊的函数strdup() ,当您调用它时,它会为您提供引擎盖下的malloc

strdup()情况下,你必须确保没有你分配你必须free它。