3

调用函数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因为我能够打印出内存位置。任何想法为什么它崩溃?

4

3 回答 3

2

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

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

于 2013-09-24T15:15:31.073 回答
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);
于 2013-09-24T15:27:38.340 回答
1

It doesn't matter that the address is not null, but rather that the data there has not already been freed. You need to search elsewhere to see if the same memory has already been freed, as Free doesn't set the given pointer to null afterwords.

于 2013-09-24T15:07:36.223 回答