何时谨慎使用free()释放malloc()分配的内存?

6

我在Stack Overflow和其他一些文章中读到了关于C语言中free()函数的问题,它可以释放未使用变量的内存。在我的情况下,我有以下代码块:

char *injectStrAt(char *str, char *strToIn, int pos)
{
    char *strC = malloc(strlen(str) + strlen(strToIn) + 1);
    strncpy(strC, str, pos);
    strC[pos] = '\0';
    strcat(strC, strToIn);
    strcat(strC, str + pos);
    return strC;
}

我使用上述函数将字符串块注入到一个数组中。我正在使用malloc来创建一个新的char*。在上述情况下,我需要执行free(strC)吗?请给出建议。

1
不,你不应该在 injectStrAt 函数内部使用 free()。你需要稍后在数组元素或保存字符串地址的任何变量上使用它。 - StoryTeller - Unslander Monica
3个回答

7

strC是该函数的返回值,因此您不需要在函数内调用free(strC)。您需要在函数外部释放它,在该字符串不再使用时释放。


3
由于你的函数返回了 strC,我们可以假设它必须在此函数返回后仍然有效,因此该函数不能 释放 该缓冲区。一旦被释放,该缓冲区就不再有效,因此不能使用它。
在这种情况下,你的调用者负责释放它。

2

不,你不应该在这个函数内部释放strC,因为它是这个函数的返回值。如果你这样做了,那么这个语句:

return strC;

将返回一些意外或垃圾值。

char* stringA = injectStrAt(str, strToIn, pos);
printf("StringA: %s"); // unexpected value.

那么什么时候应该释放内存呢?在这种情况下,应该在从函数injectStrAt()返回strC的值到stringA后进行。虽然通常情况下,当不再需要分配内存的字符串或变量时,内存才会被释放。

char* stringA = injectStrAt(str, strToIn, pos);
/... use the string

free(stringA);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接