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

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

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

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

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

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

 return strC; 

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

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

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

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