后续函数调用中的malloc

时间:2011-11-10 14:57:05

标签: 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()。​​

我听到你提出的第一个问题是为什么不在适当的时候自由(),即不再需要复制文本?

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

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

问题很简单,free()实际上会释放我的calloc()分配的内存吗?

5 个答案:

答案 0 :(得分:3)

另一方面是现在:

  1. copyText()返回的指针只有在下一次调用copyText()时才有效 - 这对来电者来说根本不明显,并且可能值得记录为显着你可以;
  2. 该功能不是线程安全的。
  3. 更好的方法可能是要求显式free()(可能将其包含在名为freeText()的函数中,作为copyText()的对应部分。)

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

答案 1 :(得分:1)

strdup()出了什么问题? calloc()似乎无用,因为你立即用copiedText中的内容覆盖内存。你实际上是“双重初始化”,这只是浪费时间。

free()而言,我不确定你指的是什么?内存将被释放,但是,由于内存碎片,它可能会也可能不会释放到系统中。我真的不担心这个......

答案 2 :(得分:1)

如果你不相信你的用户free(),我当然不会相信他们这个功能。如果不查看代码,那么对copyText()的每次调用都不会消除最后一次调用。

 main(){
    char *a=copyText("Hello, ");
    char *b=copyText("World!\n");
    printf("%s%s",a, b);
}

当然不能按预期工作。

在线程环境中,这种影响甚至更加明显且危险。完全有可能一个线程释放copiedText,而另一个线程正在写入它,导致未定义的行为。甚至可以想象一个线程将copiedText缩小到其参数的大小,然后另一个线程写入大量数据,认为它有足够的空间,并且超出缓冲区,使您的代码容易受到堆溢出攻击。 / p>

答案 3 :(得分:1)

这里使用全局变量坏主意。这是一个隐藏的副作用。现在似乎很容易理解,但是在6个月内,当你的项目有10000个位置时,忘掉它。所以不要这样做。作为一项规则,避免副作用,避免执行多个不同的无关事物的功能,避免长时间的功能。

char *copyText(const char *text)
{
   return strcpy(malloc((strlen(text) + 1)), text);
}

答案 4 :(得分:0)

我认为简单

char *copyText(char *text)
{
 if (copiedText != NULL)
   free(copiedText);
copiedText = strdup(text);
return copiedText;
}

应该适用于你想要的东西,但是就像aix所说的那样,前一次调用的所有指针都不再存在