我正在用C写一个链接列表。
list.htypedef 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.ctypedef 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之前,我是否也应该释放它包含的“项”呢?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"));*
我的解决方案好吗?如果没有,它在哪里有缺陷?有没有更好的方法?
发布于 2017-12-29 02:23:02
通常(尤其是在编写库代码时),应该劝阻您释放其他人分配的内存。也就是说,您不知道他们最初使用哪个分配器来分配它。(毕竟,它可能在堆栈上!)你也不知道他们是否需要任何额外的破坏,然后再重新分配。
尽管如此,这并不是说这个规则不能在特殊情况下被打破,但是如果您必须打破它,请确保在您的文档中明确声明它。
https://softwareengineering.stackexchange.com/questions/363092
复制相似问题