Free()崩溃程序

时间:2013-09-24 15:05:13

标签: c free

调用函数b_destroy时,程序在到达函数末尾之前崩溃。该函数如下所示:

void b_destroy(Buffer * const pBD){
#ifdef DEBUG
printf("IN DESTROY\n");
printf("BUFFER ADDRESS %d\n",pBD);
printf("HEAD ADDRESS %d\n",pBD->ca_head);
#endif
if(pBD != NULL || pBD->ca_head != NULL){
    if (pBD->ca_head != NULL)
        free(pBD->ca_head);
    if (pBD != NULL)
        free(pBD);
}
#ifdef DEBUG
    printf("EXITING DESTROY\n");
#endif
}

我知道指针不是NULL,因为我能够打印出内存位置。有什么想法崩溃吗?

3 个答案:

答案 0 :(得分:2)

当你释放一些指针时,你应该立即将指针设置为NULL。如果你不这样做,他们可能会导致程序崩溃。您的计划可能就是这种情况。也总是使用%x(用于内存地址)格式说明符而不是%d(用于有符号整数)打印地址

需要查看完整的程序才能找到问题所在。尝试在可能解决问题的所有位置释放后,尝试将指针设置为NULL。

答案 1 :(得分:2)

在这里仔细考虑你的逻辑:

if(pBD != NULL || pBD->ca_head != NULL)

如果pBD为0,那么你的逻辑是:

if(0 || 0->ca_head != NULL) { // that 0-> will seg fault

}

也许你想要这样的东西:

if (pBD && pBD->ca_head)
    free(pBD->ca_head);
if (pBD)
    free(pBD);

答案 2 :(得分:1)

地址不为空并不重要,而是那里的数据尚未被释放。您需要在其他地方搜索以查看是否已释放相同的内存,因为Free不会将给定指针设置为空后字。