这让我发疯了。当我在这个双向链表上运行我的测试程序时,当我尝试释放我的列表时,它给了我一个Segmentation错误。我知道由于没有正确释放分配的内存而导致内存泄漏,但无论我尝试什么它似乎都没有解决它。关于我需要释放内存以避免内存泄漏和seg错误的任何帮助将不胜感激
struct list {
char *value;
struct list *next;
struct list *prev;
};
const char *list_node_value(list_t *node) {
return node->value;
}
list_t *list_first(list_t *list) {
return list;
}
list_t *list_last(list_t *list) {
return list->prev;
}
list_t *list_next(list_t *node) {
return node->next;
}
list_t *list_previous(list_t *node) {
return node->prev;
}
static void failed_allocation(void) {
fprintf(stderr, "Out of memory.\n");
abort();
}
static list_t *new_node(const char *value) {
list_t *node = malloc(sizeof(list_t));
if (!node) failed_allocation();
node->value = malloc(strlen(value));
if (!node->value) failed_allocation();
strcpy(node->value, value);
return node;
}
list_t *list_insert_before(list_t *list, list_t *node, const char *value) {
list_t *insert_node = new_node(value);
insert_node->prev = node->prev;
insert_node->next = node;
insert_node->next->prev = insert_node;
insert_node->prev->next = insert_node;
if (list == node) {
return insert_node;
} else {
return list;
}
}
list_t *list_append(list_t *list, const char *value) {
if (list) {
(void) list_insert_before(list, list, value);
return list;
} else {
list_t *node = new_node(value);
node->prev = node->next = node;
return node;
}
}
list_t *list_prepend(list_t *list, const char *value) {
if (list) {
return list_insert_before(list, list, value);
} else {
list_t *node = new_node(value);
node->prev = node->next = node;
return node;
}
}
list_t *list_remove(list_t *list, list_t *node) {
(node->prev)->next = node->next;
(node->next)->prev = node->prev;
if (list != node) {
return list;
} else {
return list->next == list ? NULL : list->next;
}
}
void list_free(list_t *list) {
while (list_remove(list, list_last(list)) != NULL) { }
}
void list_foreach(list_t *list, void (*function)(const char*)) {
if (list) {
list_t *cur = list_first(list);
do {
function(cur->value);
cur = cur->next;
} while (cur != list_first(list));
}
}
答案 0 :(得分:1)
您的问题是堆损坏。 你有:
node->value = malloc(strlen(value));
它应该是:
node->value = malloc(strlen(value)+1);
答案 1 :(得分:1)
你根本没有放任何东西;将其从列表中断开不会释放它。
这不仅仅是一个双重链接列表;这是一份循环清单。
我没有看到初始化列表的代码,这可能是您问题的根源。
答案 2 :(得分:0)
答案 3 :(得分:0)
if (!node) failed_allocation();
node->value = malloc(strlen(value));
问题是你没有为'\0'
NUL字节分配空间。尝试:
if (!node) failed_allocation();
node->value = malloc(strlen(value)+1);
答案 4 :(得分:0)
我在这里看到至少一个缺陷:
node->value = malloc(strlen(value));
保持零终结符char应为strlen(value) + 1
,否则下一次strcpy()
调用将导致缓冲区溢出并可能损坏堆:
node->value = malloc(strlen(value) + 1);