我们说我有一段包含此内容的代码片段
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)或者每次只需一次?到目前为止,我还没有找到任何直接解决这个问题的文章,所以我认为一次释放就足够了。如果此问题缺少任何信息,请通知我。谢谢。
答案 0 :(得分:1)
不,如果成功,对realloc
的调用将释放旧缓冲区。在此循环之后,您只需要执行一次free (inputStrings);
。
但是,在释放之前,您需要循环inputStrings
并在其中的每个条目上调用free
(这对应于调用inStr = malloc
.... < / p>
答案 1 :(得分:1)
您只需要free(inputStrings)
一次。所有realloc()
调用都释放旧块并分配新块。
对于free(inputStrings[i])
到i
的{{1}}的每个值,您都需要0
。分配的所有东西最终都需要被释放。
当你完成数组后,你应该这样做:
nElems-1