【发布时间】:2011-03-17 12:55:17
【问题描述】:
我有一些 C 代码:
typedef struct {
size_t len;
size_t alloclen;
char *buf;
} str;
void strnappnd(str **s, const char *buf, size_t n) {
if ((*s)->len + n >= (*s)->alloclen) {
size_t nalloclen = (*s)->len + n + 1;
void *tmp = realloc((*s)->buf, nalloclen);
if (!tmp) {
printf("failure");
exit(-1);
}
(*s)->buf = tmp;
(*s)->alloclen = nalloclen;
}
memccpy((*s)->buf + (*s)->len, buf, '\0', n);
(*s)->len += n;
(*s)->buf[(*s)->len] = '\0';
}
void strfree(str **s) {
free((*s)->buf);
free(*s);
*s = NULL;
}
显然,strnappnd 在 realloc 行泄漏。为什么?
【问题讨论】:
-
@user282635 在最终重新分配之后,您最终释放了
(*s)->buf吗? -
@aix:我认为使用 realloc 意味着您不需要释放缓冲区。
-
您如何检测泄漏?
-
重要的是当已经有足够的空间时不追加字符串。
-
三点:1)函数名不能以“str”开头,这是保留的命名空间; 2)考虑将缓冲区增加超过 1 个字节,如果这是出于通用目的,则可以更好地摊销多个附加的成本; 3) 正如@pmg 所说,对于缓冲区足够大的情况,似乎缺少代码。将其从 realloc() 路径中分解出来。
标签: c memory-management realloc