Abe*_*rte 8 c memory-management linked-list
我正在用C实现一个链表,我遇到的问题是C没有实现任何特定的内存管理方案,只是让你能够通过传递指针来分配和释放内存.没有关于程序中是否可能需要该值的概念.
我在线查找链表的典型实现基本上解除了已删除节点的dealloc,但没有取消分配节点的值.
当从列表中删除时,释放由值占用的内存应该是谁的责任?链表或程序的正常流程?
例:
// allocate 10 bytes
char *text = malloc(sizeof(char) * 10);
// create the linked list
LinkedList *list = list_create();
// add the text pointer to the linked list
list_append(list, text);
// remove the pointer from the linked list
list_remove_last(list);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,文本最终不会被释放,因为list_remove_last只释放新节点占用的内存.释放文本所占用的内存的正确方法是什么?
C 没有实现任何特定的内存管理方案,只是让您能够通过传递指针来分配和释放内存
是的,C 缺乏任何类型的自动内存管理,因此您必须小心地释放实例化的任何内存块。
当从列表中删除值时,释放该值所占用的内存应该由谁负责?链表还是程序的正常流程?
这是你的责任。你可以随心所欲地做。您可以编写一个通用链接列表,其中调用者必须负责为列表中的每个值分配和取消分配空间,因为列表管理函数不知道每个值可能需要多少空间,或者是否需要这些值超出节点的生命周期。或者,您可以编写一个列表实现来管理节点的各个方面,包括存储在节点中的值的空间。在某些情况下,列表节点包含节点定义中的值,例如:
struct Node {
struct Node *next;
int value;
};
Run Code Online (Sandbox Code Playgroud)
有时节点有一个指向具有实际值的其他块的指针:
struct Node {
struct Node *next;
void *value;
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是定义一个仅包含列表操作所需的部分(即指针next)的结构,然后将数据搭载到该结构上:
struct Node {
struct Node *next;
};
struct MyNode {
struct Node node;
int price;
int quantity;
};
Run Code Online (Sandbox Code Playgroud)
所以,方法有很多种,而且没有一个是错的。您应该选择适合您需求的样式。您是否有不想重复的大而复杂的值,想要将其存储在链接列表中,但即使在从列表中删除它们后仍想继续使用它们?使用上面的第一种样式。您想在一个地方管理与链表相关的所有内容吗?然后选择第二种风格。
要点是:C 的规定比其他语言少得多,虽然这意味着您必须更加努力地考虑程序的正确性,但您也可以自由地以您选择的风格非常直接地做事。拥抱它。