什么时候小心使用free()来释放malloc()用过的内存?

时间:2014-03-10 11:21:37

标签: c malloc free

我在这里读了很多问题,其中一些关于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)吗?建议请。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

由于您的函数返回strC,因此假定它在返回此函数后必须保持有效,因此该函数必须 free()该缓冲区。一旦它被释放,缓冲区就不再有效,所以不能使用。

在这种情况下,您的来电者有责任将其释放。

答案 2 :(得分:2)

不,你不应该在这个函数中释放strC,因为它是这个函数的返回值。如果您这样做,声明:

return strC;

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

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

那么什么时候应该释放记忆?好吧,在这个特殊情况下,从strC函数返回injectStrAt() stringA的值后,您应该这样做。尽管通常在不再需要分配内存的字符串或变量时释放内存。

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

free(stringA);