经过一些痛苦的经历,我理解了悬空指针和双重释放的问题。我正在寻求合适的解决方案。
aStruct
包括其他数组在内的多个字段。
aStruct *A = NULL, *B = NULL;
A = (aStruct*) calloc(1, sizeof(sStruct));
B = A;
free_aStruct(A);
...
// Bunch of other code in various places.
...
free_aStruct(B);
有没有办法编写free_aStruct(X)
,使得free_aStruct(B)
能够优雅地退出?
void free_aStruct(aStruct *X) {
if (X ! = NULL) {
if (X->a != NULL) { free(X->a); x->a = NULL; }
free(X); X = NULL;
}
}
上述操作只有在调用free_aStruct(A);
时才会将A = NULL
。此时,B
成为“悬挂指针”。
如何避免或解决这种情况?引用计数是唯一可行的解决方案吗?还是有其他“防御性”方法可以释放内存,以防止free_aStruct(B);
导致程序崩溃?