【问题标题】:Valgrind doesn't like my realloc()?Valgrind 不喜欢我的 realloc()?
【发布时间】:2017-06-29 04:40:02
【问题描述】:
uint32_t * newArr = realloc( myStruct->arr, 2 * muStruct->Capacity * sizeof(myStruct->arr) )

if (newArr == null)
{
    free(myStruct->arr);
    return false;
}
else
{
    myStruct->arr = newArr;
    myStruct->Capacity *= 2;
    ...

Valgrind 对此表示:

Address 0x51f7c80 is 0 bytes after a block size of 80 alloc'd
    at 0x4C2BB78: realloc (vg_replace malloc.c:785)

这里发生了什么?是我的 newArr == null 案例吗?

【问题讨论】:

  • 它不是在抱怨realloc,而是在代码后面的东西。
  • 您提供的 valgrind 输出片段并不是对您的 realloc() 呼叫的抱怨。它只是其关于访问违规的报告的信息附录。
  • sizeof(myStruct->arr) 是指针的大小,而不是它指向的类型。
  • ...因此,您可能没有按预期分配尽可能多的内存,并随后在分配之外写入。

标签: c memory valgrind heap-memory realloc


【解决方案1】:

该错误表明您在某处读取(或写入)超出了数组的边界,如valgrind article concerning debugging of memory problems 中所述:

sample2.c:从图二的输出中可以看出,引用了 两个数组中的元素 513 导致写入错误、读取错误和 另一个写入错误。消息地址 0x40CA0224 是 0 字节后 大小为 512 的块已分配表示没有超出的存储空间 512 字节数组的结尾。

这可能在您程序中的其他地方。声明 if (newArr == null) ... free(myStruct->arr) 是正确的恕我直言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多