當我 valgrind 時,我的main.c 中有記憶體泄漏和錯誤(錯誤在另一個測驗檔案中)。(最后的螢屏)另外,我必須只在list.c中的函式list_destroy中釋放!
看一下這個 :
編輯:感謝@kirjosieppo,我在下面的 create_cell 函式中洗掉了一個 malloc !現在:valgrind_updated
細胞
// cell_s has gpointer ptr_value and struct cell_s *next
cell_t* create_cell(gpointer v) {
cell_t *c = malloc(sizeof(cell_t));
c->next = NULL;
c->ptr_value = v;
return c;
}
void destroy_int(gpointer data) {
free((int *) data);
}
串列.c
// list_s has cell_t *head and int size
list_t* list_create() {
list_t *l = malloc(sizeof(list_t));
l->head = NULL;
l->size = 0;
return l;
}
void list_insert_in_head(list_t *l, gpointer element) {
// typedef cell_t* adr
adr address_c = create_cell(element);
address_c->next = l->head;
l->head = address_c;
l->size;
}
void list_insert_next(list_t *l, gpointer element, adr address) {
adr address_c = create_cell(element);
if (l->head == NULL) {
liste_insert_in_head(l, element);
} else {
address_c->next = address->next;
address->next = address_c;
}
l->size;
}
void list_remove_in_head(list_t *l) {
if (l->head != NULL) {
l->head = l->head->next;
}
--l->size;
}
void list_remove_after(list_t *l, adr address) {
if (l->head->next == NULL) {
printf("Use list_remove_in_head function\n");
} else if (address != NULL) {
address->next = address->next->next;
--l->size;
}
}
// Here is the problem !
void list_destroy(list_t *l, list_gfree ft_destroy) {
adr current = l->head;
while(current != NULL) {
adr tmp = current;
current = current->next;
ft_destroy(tmp->ptr_value);
tmp->ptr_value = NULL;
ft_destroy(tmp);
}
free(l);
}
主檔案
int main(void) {
list_t *l = list_create();
int *ptr_int = (int *)malloc(sizeof(int));
*ptr_int = 4;
list_insert_in_head(l, ptr_int);
printf("Size : %d\n", l->size);
int *ptr_int_2 = (int *)malloc(sizeof(int));
*ptr_int_2 = 7;
list_insert_in_head(l, ptr_int_2);
printf("Size : %d\n", l->size);
int *ptr_int_3 = (int *)malloc(sizeof(int));
*ptr_int_3 = 100;
list_insert_next(l, ptr_int_3, l->head);
printf("Size : %d\n", l->size);
list_remove_in_head(l);
printf("Size : %d\n", l->size);
list_remove_next(l, l->head);
printf("Size : %d\n", l->size);
list_remove_next(l, l->size);
printf("Size : %d\n", l->size);
list_destroy(l, destroy_int);
}
valgrind
在我的插入中檢測到記憶體泄漏。
瓦爾格林德
感謝您幫助我實作 0 次記憶體泄漏和 0 次錯誤!:-)
uj5u.com熱心網友回復:
我還沒有測驗這是否真的是(唯一的)問題,但有這樣的代碼:
create_cell(gpointer v) {
// clip
c->ptr_value = malloc(sizeof(int));
c->ptr_value = v;
進行分配,然后將指標丟棄。
讓我們繼續!還有什么可尋的?
在list_remove_in_head()
單元格中l->head
被寫入并沒有被釋放。它可以用這樣的東西來修復:
void list_remove_in_head(list_t *l) {
if (l->head != NULL) {
void *tmp = l->head->next;
free(l->head->ptr_value);
free(l->head);
l->head = tmp;
}
--l->size;
}
這同樣適用于list_remove_after()
,但我想你可以自己解決。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386846.html
上一篇:f(&a)可以在C中運行嗎?
下一篇:malloc中斷函式