【发布时间】:2021-11-25 14:18:06
【问题描述】:
下面的第一个 if 语句检查在向数组添加元素时是否已达到缓冲区大小的末尾。如果我们有,它会复制原始大小。
while (token != NULL) {
tokens[position] = token;
position++;
if (position >= bufsize) {
bufsize += LSH_TOK_BUFSIZE;
tokens_backup = tokens;
tokens = realloc(tokens, bufsize * sizeof(char*));
if (!tokens) {
free(tokens_backup);
fprintf(stderr, "lsh: allocation error\n");
exit(EXIT_FAILURE);
}
}
token = strtok(NULL, LSH_TOK_DELIM);
}
最后一个 if 语句检查分配错误,如果发生这种情况,它会释放 tokens_backup,它指向原始的 tokens。
为什么这里需要 tokens_backup?
如果确实存在分配错误,他们不能简单地释放原来的tokens吗?
两者的声明是:
char **tokens = malloc(bufsize * sizeof(char*));
char *token, **tokens_backup;
【问题讨论】:
-
一般来说,在返回错误代码之前释放一个特定的内存分配是无稽之谈。我知道您对这段代码有些困惑,我认为该代码不应该存在。
-
@Cheatah 人们可以选择保持分配/空闲的完美同步,而不必为
valgrind和 LeakSanitizer 创建抑制规则(如果 LeakSanitizer 甚至支持抑制规则)。保持它的清洁通常比过滤掉“没有问题的泄漏”更容易。 -
在这些情况下,调用完整的清理和退出例程会更有意义,而不是只关注最近的
realloc并不干净地退出。但我想这主要是基于意见的。但我明白你的意思。