【问题标题】:when to carefully use free() to free up malloc() used memory?何时谨慎使用 free() 来释放 malloc() 使用的内存?
【发布时间】:2014-04-13 11:20:38
【问题描述】:

我从 SO 中的许多问题和其他一些关于 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) 吗?请指教。

【问题讨论】:

  • 不...你不使用free() inside injectStrAt。您需要在数组元素或稍后保存字符串地址的任何内容上使用它。

标签: c malloc free


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    在这种情况下,您的调用者负责释放它。

    【讨论】:

      【解决方案3】:

      不,你不应该在这个函数中释放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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-30
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        相关资源
        最近更新 更多