调用函数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
,因为我能够打印出内存位置。有什么想法崩溃吗?
答案 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不会将给定指针设置为空后字。