【发布时间】:2020-03-22 05:54:50
【问题描述】:
我想将所有指向已释放内存位置的指针设置为 NULL,这样就不会出现悬空指针或双重释放。这在 C 中可能吗?
例如,我有以下结构:
struct B {
int *arr;
unsigned int len;
};
struct A {
struct B *b;
};
// Freeing and setting them to NULL:
bool test_safe_free() {
struct A *a = malloc(sizeof(struct A));
struct B *b = malloc(sizeof(struct B));
b->arr = malloc(100 * sizeof(int));
b->len = 100;
a->b = b;
safe_free_A(&a);
return a == NULL && b == NULL;
}
void safe_free_B(struct B **b_ref) {
if (*b_ref != NULL) free((*b_ref)->arr);
(*b_ref)->arr = NULL;
free(*b_ref);
*b_ref = NULL;
}
void safe_free_A(struct A **a_ref) {
// Before freeing A, freeing B:
if (*a_ref != NULL) safe_free_B(&((*a_ref)->b));
free(*a_ref);
*a_ref = NULL;
}
test_safe_free函数返回false,因为即使变量a在释放后设置为NULL,b仍然指向释放的内存,因为指针被复制了(并且副本设置为NULL,而原来的保持不变)当a传入函数时。
我想不出一种方法,一个结构来解决这个问题,但我也不确定我正在尝试做的事情是否可能。
【问题讨论】:
-
@JonathonReinhart 感谢您提供信息。
-
即使你能做到这一点,这也是个坏主意。那些神奇地设置为 NULL 的指针,如果使用的话,会导致混乱。您的问题是垃圾收集的绝佳论据。
-
@ddyer 什么乱七八糟的?该标准实际上允许编译器将任何指向已释放存储的指针设置为 NULL 或任何其他值。如果程序尝试使用指针的值来释放存储空间,则程序具有未定义的行为
-
@ddyer 没有那样想。当我释放一个包含另一个结构 B 的结构 A 时,我想避免双重释放,然后在其他地方释放该结构 B。例如:如果我有一个结构 A 的列表和另一个 B 的列表,如果该列表中的一些 B 已经在 A 列表中的一些 A 中,并且我尝试释放这两个列表,我将获得双重释放。我能想到的避免跟踪在哪里释放什么并避免双重释放的唯一方法是将指向已释放内存位置的每个指针设置为 NULL。
标签: c pointers memory-management dynamic-memory-allocation