我正在运行一些旧代码,并且valgrind报告“无效的读取错误”。我无法发布这些旧代码,因此我将使用以下代码来描述问题。
我有一些类似下面的代码。 MY_MALLOC()和MY_FREE()分别是malloc()和free()的包装。
void func1()
{
int i = 0, j = 0;
int **ptr = NULL;
MY_MALLOC(ptr, int *, 5);
for (i = 0; i < 5; i++)
{
ptr[i] = NULL;
MY_MALLOC(ptr[i], int, 4);
for (j = 0; j < 4; j++)
{
ptr[i][j] = 0;
}
}
......
for (i = 0; i < 5; i++)
{
MY_FREE(ptr[i]); // Line 100 in test.c
ptr[i] = NULL;
}
MY_FREE(ptr);
ptr = NULL;
}
void func2()
{
......
while (MY_CHECK(another_ptr->index)) // Line 200 in test.c
{
......
another_ptr++;
}
}
并且valgrind报告错误:
==23912== Invalid read of size 4
==23912== at 0x5094EE: func2 (test.c:200)
......
==23912== Address 0x4d7b1d4 is 0 bytes after a block of size 4 free'd
==23912== at 0x4A06430: free (vg_replace_malloc.c:446)
==23912== by 0x498F4C: func1 (test.c:100)
func1中的双指针ptr是一个局部变量,看起来它已被适当地分配和释放。我不明白为什么它会影响另一个不相关的变量another_ptr(another_ptr是全局变量)。而且我真的不知道如何解决此错误。任何建议将不胜感激!