【发布时间】:2014-09-20 10:47:02
【问题描述】:
我正在开发一个使用字符串缓冲区的项目。我一直在使用 free() 和 malloc() 出现随机错误——比如“无效的下一个大小(快速)”,并怀疑它是否是由于一些内存堆损坏。我正在使用 gcc。我在二进制文件上使用了 valgrind,这是总结:
ERROR SUMMARY: 26887 errors from 39 contexts (suppressed: 0 from 0)
我认为这有点太高了。我附上了 valgrind memcheck 输出 here 的 pastebin 大多数问题似乎都来自一个函数:strbuf_addc()。 strbuf 是一个可以自动增长的字符串缓冲区。我在这里粘贴了一些 strbuf 函数。
int strbuf_add(struct strbuf *string, const char *c)
{
if(string == NULL || c == NULL) return 0;
while(*c != '\0') {
if(!strbuf_addc(string, *c++))
return 0;
}
return 1;
}
int strbuf_addc(struct strbuf *string, char c)
{
size_t space_available;
assert(string != NULL);
space_available = string->allocated - string->length;
if(space_available <= 1) {
if(!grow_buffer(string)) {
return 0;
}
}
string->buffer[string->length++] = c;
string->buffer[string->length] = '\0';
return 1;
}
static int grow_buffer(struct strbuf *string)
{
char *tmp;
size_t toallocate;
assert(string != NULL);
toallocate = string->allocated + (string->allocated / 2);
tmp = (char*) realloc(string->buffer, toallocate);
if(tmp) {
string->buffer = tmp;
string->allocated = toallocate;
return 1;
}
return 0;
}
我不确定 strbuf_addc 是罪魁祸首还是我编写的其他函数。请看一下。我基本上将字符串文字作为第二个参数传递给 strbuf_add。我不确定它们是否会以 null 结尾,但我想 c 中的字符串文字是以 null 结尾的。我也试过从文件中读取字符串,仍然有一些错误。
【问题讨论】:
-
好的,我想我找到了问题所在。如果我的初始 strbuf 大小为 1,则在 grow_buffer() string->allocated/2 中将失败,这正是我一直在做的。 Valgrind 现在没有任何错误。让我对此进行更多测试:)
标签: c string valgrind heap-memory heap-corruption