Кажется, я не могу найти проблему в том, почему всегда есть утечка с функцией prio_q_create
. Я освобождаю его с помощью prio_q_destroy
, но valgrind все еще показывает ошибку утечки.
#include <stdlib.h>
#include <stdio.h>
typedef struct prio_q prio_q;
typedef struct elem elem;
struct prio_q {
int size;
struct elem *first;
};
struct elem {
void *data;
int prio;
struct elem *next;
};
struct prio_q *prio_q_create() {
prio_q *list = calloc(1, sizeof(prio_q));
list->first = NULL;
list->size = 0;
return list;
}
void prio_q_push(struct prio_q *q, void *data, int prio) {
elem *e = calloc(1, sizeof(elem));
e->prio = prio;
e->data = data;
e->next = NULL;
if (q->first == NULL) {
q->first = e;
q->size = q->size + 1;
} else {
if (q->first->prio < prio) {
e->next = q->first;
q->first = e;
q->size = q->size + 1;
} else {
elem *temp = q->first;
while (temp->next != NULL && temp->next->prio >= prio) {
temp = temp->next;
}
e->next = temp->next;
temp->next = e;
q->size = q->size + 1;
}
}
}
void *prio_q_pop(struct prio_q *q) {
if (q->first != NULL) {
elem *temp = q->first;
q->first = q->first->next;
void *data = temp->data;
temp->next = NULL;
free(temp);
return data;
} else
exit(0);
}
void *prio_q_front(struct prio_q *q) {
return q->first->data;
}
void prio_q_destroy(struct prio_q *q) {
elem *temp = q->first;
elem *next_temp;
while (temp != NULL) {
next_temp = temp->next;
free(temp);
temp = next_temp;
}
free(q);
}
int main() {
struct prio_q *queue;
char *s;
int i;
queue = prio_q_create();
prio_q_push(queue, "amet...", 2);
prio_q_push(queue, "ipsum", 7);
prio_q_push(queue, "dolor", 4);
prio_q_push(queue, "Lorem", 22);
prio_q_push(queue, "sit", 3);
prio_q_push(queue, "Hello World", 1);
prio_q_push(queue, "Bye World", 0);
for (i = 0; i < 5; i++) {
s = prio_q_pop(queue);
printf("%s\n", s);
}
s = prio_q_front(queue);
printf("%s\n", s);
prio_q_destroy(queue);
return 0;
}
Должен быть весь код. Основное в основном помещает некоторые строки с номером prio в список и выводит их через цикл.
![The valgrind error](https://i.stack.imgur.com/sKs2m.jpg)