取消引用的指针的值在释放后是否保留?
Does the value of a dereferenced pointer remain after freeing it?
我正在用 C 开发一个项目,我正在制作一个堆栈数据结构。我想知道我是否弹出第一个元素,如果我可以释放它只是为了避免处理潜在的内存泄漏,如果它以后没有被释放。
struct node_s {
int a;
int b;
struct node_s *next;
}
struct list_s {
struct node_s *head;
size_t size;
}
typedef struct node_s *nodep_t;
typedef struct list_s *listp_t;
这样的东西行得通吗?
struct node_s pop(listp_t list) {
struct node_s node = *(list->head);
nodep_t new_head = list->head->next;
free(list->head);
list->head = new_head;
return node;
}
如果不是,我会按照最初的方式进行操作,稍后手动释放内存:
nodep_t pop(listp_t list) {
nodep_t node = list->head;
list->head = list->head->next;
return node;
}
两者都可以。
正如您所指出的,后者需要 调用者 在完成相关节点后对其进行清理。此外,一旦修复错误检查(你打算修复它,right?),它允许你 return 一个值给调用者,表明 error/empty状态(例如 NULL)。前者不允许这样做。简而言之,第一个版本无法告诉调用者“bad pop”。这就是大多数人部署 pop
机制的原因 没有 结果 returned,一种 top
访问列表前端的访问方法 without 在过程中删除它,以及一个 empty
方法来检查列表是否为空。这三个中的三个是典型的,并提供您需要的功能。
然而,在 两种 情况下,“事物”的 next
成员被 returned(假设在后者中 non-NULL case) 应该在 return 之前被清除为 NULL,以免你有窥探的眼睛窥视你的容器。
我正在用 C 开发一个项目,我正在制作一个堆栈数据结构。我想知道我是否弹出第一个元素,如果我可以释放它只是为了避免处理潜在的内存泄漏,如果它以后没有被释放。
struct node_s {
int a;
int b;
struct node_s *next;
}
struct list_s {
struct node_s *head;
size_t size;
}
typedef struct node_s *nodep_t;
typedef struct list_s *listp_t;
这样的东西行得通吗?
struct node_s pop(listp_t list) {
struct node_s node = *(list->head);
nodep_t new_head = list->head->next;
free(list->head);
list->head = new_head;
return node;
}
如果不是,我会按照最初的方式进行操作,稍后手动释放内存:
nodep_t pop(listp_t list) {
nodep_t node = list->head;
list->head = list->head->next;
return node;
}
两者都可以。
正如您所指出的,后者需要 调用者 在完成相关节点后对其进行清理。此外,一旦修复错误检查(你打算修复它,right?),它允许你 return 一个值给调用者,表明 error/empty状态(例如 NULL)。前者不允许这样做。简而言之,第一个版本无法告诉调用者“bad pop”。这就是大多数人部署 pop
机制的原因 没有 结果 returned,一种 top
访问列表前端的访问方法 without 在过程中删除它,以及一个 empty
方法来检查列表是否为空。这三个中的三个是典型的,并提供您需要的功能。
然而,在 两种 情况下,“事物”的 next
成员被 returned(假设在后者中 non-NULL case) 应该在 return 之前被清除为 NULL,以免你有窥探的眼睛窥视你的容器。