释放内存时指针无效

时间:2015-08-06 05:37:06

标签: 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]

请帮助!!

3 个答案:

答案 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)

  

请帮忙

ValgrindAddress Sanitizeralso implemented in GCC)下运行您的计划。有可能,他们会直接指出你的错误。

  

很多事情发生了

可能是那里发生了错误。

答案 2 :(得分:0)

*** glibc detected *** XYZ: free(): invalid pointer: 0x0000000006b61021 ***

这一行声明,你试图删除的指针无效,代码的一部分,你说很多事情发生了,你必须改变changeTime的值,你会有使它指向别的东西,而不是最初分配的记忆。