c - 后续函数调用中的 malloc

标签 c malloc free

在h文件中定义:

char *copiedText;

在c文件中定义:

char *copyText(char *text){
  if (copiedText != 0) free(copiedText);
  copiedText = (char *)calloc((strlen(text) + 1) * sizeof(char), sizeof(char));
  strcpy(copiedText, text);
  return copiedText;
}

首先,这不是关于如何复制文本,我只是选择它作为示例。我的问题是关于 calloc() 之前的 free()。

我听到您问的第一个问题是为什么不在适当的时候使用 free() - 即当不再需要复制文本时?

长话短说,我正在制作一个程序的一部分,我不能相信我的函数的用户会正确地 free() copiedText,所以我想在我的函数中包含尽可能多的代码。他们所做的只是包含 h 和 c 文件并调用函数 copyText。

我知道在最后一次调用 copyText 和程序终止之间会有(轻微的)内存泄漏,但这是我愿意接受的权衡,因为我只有 malloc() 少量数据。

问题很简单,当像这样编码时,free() 是否真的会释放我的 calloc() 分配的内存?

最佳答案

现在的另一面是:

  1. copyText() 返回的指针仅在下一次调用 copyText() 之前有效 -- 这对调用者来说一点也不明显 并且可能值得尽可能突出地记录下来;
  2. 该函数不是线程安全的。

更好的方法可能是需要一个显式的 free()(也许将它包装在一个名为 freeText() 的函数中,作为 copyText( )).

另一种方法是让调用者提供他们自己的缓冲区及其大小(这样就可以避免缓冲区溢出)。

关于c - 后续函数调用中的 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8081460/

相关文章:

c - C 中 scanf 函数中的字符数组指针没有 & 符号

c - 避免链表中额外的 Malloc (node->next = NULL)

c++ - C++ 中 malloc 的自定义实现

c - OpenMP 取消部分

C编程: Interval Division

C函数在结构内部调用而不使用相同的对象

c - 从堆栈和堆中获取二维数组的函数

c - C中文件的结构内存分配,只有两个变量起作用

c++ - 嵌套对象中的内存不可用

c - 释放内存/跨平台兼容性问题