假设我有一个包含这个的代码片段
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])
从 0
到 nElems-1
的每个i
值。分配的所有内容最终都需要释放。
完成数组后,您应该执行以下操作:
for (i = 0; i < nElems; i++) {
free(inputStrings[i]);
}
free(inputStrings);
不,如果成功,对 realloc
的调用将释放旧缓冲区。在此循环之后,您只需执行一次free (inputStrings);
。
但是,在释放它之前,您需要遍历inputStrings
并对其中的每个条目调用free
(这对应于调用inStr = malloc
... 。