我有一个结构
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]
请帮助!!
答案 0 :(得分:2)
您的周期使用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
超出范围,则预计会触发此错误。
答案 1 :(得分:0)
请帮忙
在Valgrind或Address Sanitizer(also implemented in GCC)下运行您的计划。有可能,他们会直接指出你的错误。
很多事情发生了
可能是那里发生了错误。
答案 2 :(得分:0)
*** glibc detected *** XYZ: free(): invalid pointer: 0x0000000006b61021 ***
这一行声明,你试图删除的指针无效,代码的一部分,你说很多事情发生了,你必须改变changeTime
的值,你会有使它指向别的东西,而不是最初分配的记忆。