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