我有一个结构
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/