首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >销毁链接列表节点:也销毁项目?

销毁链接列表节点:也销毁项目?
EN

Software Engineering用户
提问于 2017-12-29 01:38:16
回答 1查看 957关注 0票数 5

我正在用C写一个链接列表。

list.h

代码语言:javascript
复制
typedef struct list_struct * List; /* Defined in list.c */

List create_list();
void destroy_list(List list);

void list_add(List list, void * item);
void list_remove(List list, int is_target(void *));

... /* Other handy functions like 'list_size', etc. */

list.c

代码语言:javascript
复制
typedef struct node_struct
{
  void * item;
  struct node_struct * next;
} * Node;

typedef struct list_struct
{
  Node head;
  ... /* Other handy things like size, tail, etc. */
} List;

void list_remove(List list, int is_target(void *))
{
  ... /* Find target node to delete. */
  free(target->item);
  ... /* Update links. */
  free(target);
}

... /* Other functions definitions. */

list_remove:当移除Node (它在list.c的幕后使用)时,我显然需要释放它(使用free)。但是,在释放Node之前,我是否也应该释放它包含的“项”呢?

,My Take,

Pro:释放项目的好处是,使用此API的客户端不必跟踪他在“列表”中存储的项目。另外,他也不用担心自己会把物品放出来。

Con:如果客户想在删除节点后使用该项目,他不能使用,因为它已被销毁。所以,这就是为什么释放物品可能是个坏主意。

解决方案:将函数更改为void * list_remove(List list, int is_target(void *)) (注意,它现在返回void ***)。它返回节点中的项(节点本身被销毁)。因此,如果客户端决定他不需要该项目,他只需调用** free(list_remove(my_list, homework_that_dog_ate("HW 5")));**。如果他想留着它,他可以**Homework dog_food = list_remove(my_list, homework_that_dog_ate("HW 5"));*

我的解决方案好吗?如果没有,它在哪里有缺陷?有没有更好的方法?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2017-12-29 02:23:02

通常(尤其是在编写库代码时),应该劝阻您释放其他人分配的内存。也就是说,您不知道他们最初使用哪个分配器来分配它。(毕竟,它可能在堆栈上!)你也不知道他们是否需要任何额外的破坏,然后再重新分配。

尽管如此,这并不是说这个规则不能在特殊情况下被打破,但是如果您必须打破它,请确保在您的文档中明确声明它。

票数 14
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/363092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档