这是在C中使用free()的正确方法吗?

时间:2012-03-09 16:05:47

标签: c

如果我有这个函数foo(),我从另一个函数foo2()调用它;我必须像这样释放调用函数中的内存吗?

char *foo(char *str1){
    char *str2;
    str2 = malloc((sizeof(char) * strlen(str1)) + 1);
    memcpy(str2, str1, strlen(str1) + 1)
    return str2;
}

void foo2(void){
    char *str1 = "Hello world!"
    char *str2;
    str2 = foo(str1);
    ...some stuff
    free(str2); //Should I do this here?
}

5 个答案:

答案 0 :(得分:4)

是的,除非你没有测试你的malloc是否成功

答案 1 :(得分:2)

你可以释放分配的内存,因为你做了分配,分配成功了,内存还没有被释放。

答案 2 :(得分:2)

是的,这会有效,但是你有一个错误:

char *foo(const char *str1)
{
    char *str2 = (char *)malloc((sizeof(char) * strlen(str1)) + 1);
    if (str2 != NULL)
        memcpy(str2, str1, strlen(str1) + 1);
    return str2;
}
void foo2
{
    char *str1 = "Hello world!"
    char *str2;
    str2 = foo(str1);
    ...some stuff
    free(str2);
}

传统上,您会记录调用者负责使用free()释放返回的指针的事实。

此外,您的foo()功能只不过是strdup()

答案 3 :(得分:1)

是。需要在某些时候释放内存。如您所见,您现在在foo函数与其任何调用者之间存在紧密耦合。一种常见的替代方法是传入指向char数组及其大小的指针。然后该函数返回它是否正确填充数组。这将分配和释放的责任转移给调用者。

bool * foo(char * str, size_t size)
{
  if(size < FOO_REQUIRED_SIZE) {
    return FALSE;
  } else {
    ...
    return TRUE;
  }
}

void foo2(void)
{
  char str[FOO_REQUIRED_SIZE];
  foo(str, ARRAY_SIZE(str));
}

如果函数失败,您可以进一步记录所需的数组大小,而不是简单地返回FALSE。或者,也可以提供计算所需尺寸并返回的功能。

size_t getRequiredBufSizeForFoo()
{
  // Calculate how many bytes required
  return ...;
}

void foo2(void)
{
  size_t len = getRequiredBufSizeForFoo();
  char str[len];

  foo(str, len);
}

答案 4 :(得分:1)

是的,这是对的。 foo()分配一些内存,并且必须由调用者释放。它不是一个非常好的设计,但它的工作原理。如果foo()接受两个参数:输出缓冲区及其大小,可能会更好。

void foo(char* input, char* output, int* bufferSize);

如果输出为NULL,则bufferSizefoo()写入所需的大小。