c - 释放内存时无效指针

标签 c gdb free

我有一个结构

typedef struct
{
    char **changeTime;  // Array of pointers
} r;

尺寸变量如下

int SIZE = 10;
int BYTES = 1000;

这里我分配内存

r.change_time = (char **) malloc(sizeof(char *) * SIZE);
for(i = 0 ; i < 10; i++)
    r.changeTime[x] = (char *) malloc(sizeof(char) * BYTES);

发生了很多事情

终于释放内存了

for(i = 0 ; i < 10; i++)
{
    if(r.changeTime[x] != NULL)
    {
        free(r.changeTime[x]);   <- Fails here
        r.changeTime[x] = NULL;  
    }
}

最后

if(r.change_time != NULL)
{
    free(r.change_time)
    r.change_time = NULL;
}

现在,代码在上面提到的行失败了

我使用GDB进行调试。这是输出

> *** glibc detected *** XYZ: free(): invalid pointer: 0x0000000006b61021 ***
> ======= Backtrace: ========= /lib64/libc.so.6[0x3e1b07247f] /lib64/libc.so.6(cfree+0x4b)[0x3e1b0728db]
> /panther/disk/libxc.so(free_record+0x1a)[0x2b303aadf44a]
> /panther/disk/libxc.so(MW_free+0x33)[0x2b303aadf413]
> /panther/disk/libxc.so(M1_free+0x1f)[0x2b303171a8cf]
> /panther/disk/libxc.so(M_free+0x12)[0x2b3030f91122]
> /panther/disk/libxc.so(term+0x34)[0x2b3027e4e294]
> /panther/disk/libxc.so(proc+0x8c)[0x2b3027e5252c]
> /panther/disk/libxc.so(main+0x5dd)[0x2b3027e3d79d]

请帮忙!!

最佳答案

您的循环使用 i 作为迭代器变量。但是由于某种原因,您在循环内的数组访问使用 x 作为索引

for(i = 0 ; i < 10; i++)
    r.changeTime[x] = (char *) malloc(sizeof(char) * BYTES);

x 到底是什么?它在那里做什么?如果 x[0, 10) 范围内,那么您很幸运。

无论如何,分配内存 10 次并将指针存储在同一个 r.changeTime[x] 中会将这 10 次分配中的 9 次变成内存泄漏。

后来您尝试释放相同的 r.changeTime[x] 十次。如果此时 x 超出范围,则预计会触发此错误。

关于c - 释放内存时无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847579/

相关文章:

c - 需要理解这个If语句

ubuntu - 无法在调试器内调用标准数学函数?

linux - 使用GDB读取寄存器指向的内存

configuration - 有没有办法将 dbx 配置为将空白命令视为上一个命令的重复?

python - 如何创建 Python 不会释放的缓冲区?

c - 头文件中外部函数的定义在哪里

c - 读取函数: copying buffer,重新分配内存

c++ - 如何为局部变量分配内存?

c - 在 C 中使用清理属性释放二维数组的通用函数

c - 这是释放我在 C 的多个函数中使用的动态字符串的正确方法吗?