如果在循环中多次调用malloc()和realloc(),则多次执行free()

时间:2014-11-27 01:19:35

标签: c malloc realloc

我们说我有一段包含此内容的代码片段

s = strtok_r(buffer, " \t\n", &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, " \t\n", &saveptr))!=NULL);

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

2 个答案:

答案 0 :(得分:1)

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

但是,在释放之前,您需要循环inputStrings并在其中的每个条目上调用free(这对应于调用inStr = malloc .... < / p>

答案 1 :(得分:1)

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

对于free(inputStrings[i])i的{​​{1}}的每个值,您都需要0。分配的所有东西最终都需要被释放。

当你完成数组后,你应该这样做:

nElems-1