C - 如果 malloc() 和 realloc() 在一个循环中被多次调用,则多次使用 free()ing



假设我有一个包含这个的代码片段

s = strtok_r(buffer, " tn", &saveptr);
do
{
  inStr = (char*)malloc(strlen(s)+1);
  (void) strncpy(inStr, s, strlen(s)+1);
  inputStrings=(char**)realloc(inputStrings,(nElems+1)*sizeof(char*));
  inputStrings[nElems] = inStr;
  nElems++;
}
while((s = strtok_r(NULL, " tn", &saveptr))!=NULL);

我是否必须多次释放() inStr 和 inputStrings(尤其是 for 循环中的 inputStrings,直到 nElems)还是各一次?到目前为止,我还没有找到任何直接解决这个问题的文章,所以我认为释放一次就足够了。如果此问题缺少任何信息,请通知我。谢谢。

你只需要free(inputStrings)一次。所有realloc()调用都释放旧块并分配新块。

您确实需要free(inputStrings[i])0nElems-1 的每个i值。分配的所有内容最终都需要释放。

完成数组后,您应该执行以下操作:

for (i = 0; i < nElems; i++) {
    free(inputStrings[i]);
}
free(inputStrings);

不,如果成功,对 realloc 的调用将释放旧缓冲区。在此循环之后,您只需执行一次free (inputStrings);

但是,在释放它之前,您需要遍历inputStrings并对其中的每个条目调用free(这对应于调用inStr = malloc... 。

相关内容

  • 没有找到相关文章

最新更新