修改数据结构释放函数参数,以保证结构体指针被释放后能恢复到NULL

This commit is contained in:
建峰 2024-08-28 00:23:18 +08:00
parent 81c7854033
commit 447200a5e6
14 changed files with 41 additions and 37 deletions

View File

@ -58,12 +58,12 @@ int main()
printf("----- unicstl demo -----\n"); printf("----- unicstl demo -----\n");
// while (1) // while (1)
{ {
// demo_list(); demo_list();
// demo_stack(); // demo_stack();
// demo_deque(); // demo_deque();
// demo_queue(); // demo_queue();
// demo_tree(); // demo_tree();
demo_heap(); // demo_heap();
} }
printf("----- unicstl ok -----\n"); printf("----- unicstl ok -----\n");

View File

@ -78,7 +78,7 @@ void demo_heap_num(void)
{ {
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
heap_free(heap); heap_free(&heap);
} }
static void demo_heap_struct(void) static void demo_heap_struct(void)
@ -144,7 +144,7 @@ static void demo_heap_struct(void)
{ {
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
heap_free(heap); heap_free(&heap);
} }
void demo_heap(void) void demo_heap(void)

View File

@ -292,7 +292,7 @@ static void demo_queue_struct(void)
queue->print(queue); queue->print(queue);
printf("\n"); printf("\n");
queue_free(queue); queue_free(&queue);
} }

View File

@ -141,7 +141,7 @@ void demo_avltree_num(void)
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
tree_free(tree); tree_free(&tree);
} }
static bool tree_rb_check_color(struct _tree *self, struct _tree_node* root, int black_num, int black_num_expected) static bool tree_rb_check_color(struct _tree *self, struct _tree_node* root, int black_num, int black_num_expected)
@ -326,7 +326,7 @@ void demo_rbtree_num(void)
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
#endif #endif
tree_free(tree); tree_free(&tree);
} }
/** /**
@ -458,7 +458,7 @@ void demo_rbtree_struct(void)
printf("----- empty -----\n"); printf("----- empty -----\n");
} }
#endif #endif
tree_free(tree); tree_free(&tree);
} }
void demo_tree(void) void demo_tree(void)

View File

@ -69,6 +69,6 @@ typedef struct _deque* deque_t;
bool deque_init(struct _deque* self, uint32_t obj_size); bool deque_init(struct _deque* self, uint32_t obj_size);
deque_t deque_new(void); deque_t deque_new(void);
void deque_free(deque_t deque); void deque_free(deque_t* deque);
#endif #endif

View File

@ -59,6 +59,6 @@ typedef struct _heap* heap_t;
bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity); bool heap_init2(struct _heap* self, uint32_t obj_size, uint32_t capacity);
heap_t heap_new(void); heap_t heap_new(void);
void heap_free(heap_t heap); void heap_free(heap_t* heap);
#endif // _HEAP_H_ #endif // _HEAP_H_

View File

@ -62,6 +62,6 @@ typedef struct _list* list_t;
bool list_init2(struct _list* self, uint32_t obj_size, uint32_t capacity); bool list_init2(struct _list* self, uint32_t obj_size, uint32_t capacity);
list_t list_new(void); list_t list_new(void);
void list_free(list_t list); void list_free(list_t* list);
#endif // _LIST_H_ #endif // _LIST_H_

View File

@ -58,6 +58,6 @@ bool queue_init(struct _queue * queue, uint32_t obj_size);
bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity); bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity);
queue_t queue_new(void); queue_t queue_new(void);
void queue_free(queue_t queue); void queue_free(queue_t* queue);
#endif // _QUEUE_H_ #endif // _QUEUE_H_

View File

@ -93,7 +93,7 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size);
bool tree_rb_init(struct _tree *self, uint32_t obj_size); bool tree_rb_init(struct _tree *self, uint32_t obj_size);
tree_t tree_new(void); tree_t tree_new(void);
void tree_free(tree_t tree); void tree_free(tree_t* tree);
#endif // _TREE_H_ #endif // _TREE_H_

View File

@ -333,11 +333,12 @@ deque_t deque_new(void)
return (struct _deque*)malloc(sizeof(struct _deque)); return (struct _deque*)malloc(sizeof(struct _deque));
} }
void deque_free(deque_t deque) void deque_free(deque_t *deque)
{ {
if(deque != NULL) if(*deque != NULL)
{ {
deque->destory(deque); (*deque)->destory(*deque);
free(deque); free(*deque);
} }
*deque = NULL;
} }

View File

@ -276,11 +276,12 @@ heap_t heap_new(void)
return (struct _heap*)malloc(sizeof(struct _heap)); return (struct _heap*)malloc(sizeof(struct _heap));
} }
void heap_free(heap_t heap) void heap_free(heap_t* heap)
{ {
if(heap) if(*heap != NULL)
{ {
heap->destory(heap); (*heap)->destory(*heap);
free(heap); free(*heap);
} }
heap = NULL;
} }

View File

@ -220,11 +220,12 @@ list_t list_new(void)
return (struct _list*)malloc(sizeof(struct _list)); return (struct _list*)malloc(sizeof(struct _list));
} }
void list_free(list_t list) void list_free(list_t* list)
{ {
if(list != NULL) if(*list != NULL)
{ {
list->destory(list); (*list)->destory(*list);
free(list); free(*list);
} }
list = NULL;
} }

View File

@ -340,11 +340,12 @@ queue_t queue_new(void)
return (struct _queue *)malloc(sizeof(struct _queue)); return (struct _queue *)malloc(sizeof(struct _queue));
} }
void queue_free(queue_t queue) void queue_free(queue_t* queue)
{ {
if(queue != NULL) if(*queue != NULL)
{ {
queue->destory(queue); (*queue)->destory(*queue);
free(queue); free(*queue);
} }
queue = NULL;
} }

View File

@ -177,7 +177,7 @@ int32_t tree_height(struct _tree* self, struct _tree_node* root)
count_cur_level++; count_cur_level++;
} }
} }
queue_free(queue); queue_free(&queue);
return height; return height;
#endif #endif
} }
@ -587,7 +587,7 @@ bool tree_clear(struct _tree* self)
} }
tree_node_free(node); tree_node_free(node);
} }
queue_free(queue); queue_free(&queue);
self->_root = NULL; self->_root = NULL;
self->_size = 0; self->_size = 0;
return true; return true;
@ -928,7 +928,7 @@ void tree_breadth(struct _tree* self, struct _tree_node* root)
self->print_obj(node->obj); self->print_obj(node->obj);
} }
} }
queue_free(queue); queue_free(&queue);
} }
static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* root) static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* root)
@ -1532,12 +1532,12 @@ tree_t tree_new(void)
return (struct _tree*)malloc(sizeof(struct _tree)); return (struct _tree*)malloc(sizeof(struct _tree));
} }
void tree_free(tree_t tree) void tree_free(tree_t* tree)
{ {
if(tree != NULL) if(*tree != NULL)
{ {
tree->destory(tree); (*tree)->destory(*tree);
free(tree); free(*tree);
} }
tree = NULL;
} }