From d8012720b6d017858a530d2cc13997f8ba1f8721 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Thu, 29 Aug 2024 18:30:48 +0800 Subject: [PATCH] =?UTF-8?q?init=E5=87=BD=E6=95=B0=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=A4=9A=E6=AC=A1=E8=B0=83=E7=94=A8=EF=BC=8C=E4=BD=86=E6=98=AF?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=E9=98=B2=E6=AD=A2=E5=86=85=E5=AD=98=E6=B3=84?= =?UTF-8?q?=E6=BC=8F=E3=80=82=E5=9B=A0=E6=AD=A4=E6=AF=8F=E6=AC=A1=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E6=97=B6=E5=85=88=E6=89=A7=E8=A1=8C=E4=B8=80?= =?UTF-8?q?=E6=AC=A1destory=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 3 ++- demo/demo.c | 4 ++-- src/queue.c | 28 +++++++++++++++------------- test/test_queue.c | 7 ++++--- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index fade41a..70214dc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,7 +8,8 @@ "name": "unicstl", "type": "cppdbg", "request": "launch", - "program": "${workspaceFolder}/build/release/bin/test.exe", + // "program": "${workspaceFolder}/build/release/bin/test.exe", + "program": "${workspaceFolder}/build/release/bin/demo.exe", "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", diff --git a/demo/demo.c b/demo/demo.c index d353d61..b1519cf 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -58,10 +58,10 @@ int main() printf("----- unicstl demo -----\n"); // while (1) { - demo_list(); + // demo_list(); // demo_stack(); // demo_deque(); - // demo_queue(); + demo_queue(); // demo_tree(); // demo_heap(); } diff --git a/src/queue.c b/src/queue.c index 2d39a50..2b6b06e 100644 --- a/src/queue.c +++ b/src/queue.c @@ -134,12 +134,15 @@ static bool queue_clear(struct _queue* self) static bool queue_empty(struct _queue* self) { assert(self != NULL); - return self->_size == 0; + assert(self->size != NULL); + return self->size(self) == 0; } static bool queue_full(struct _queue* self) { assert(self != NULL); + assert(self->size != NULL); + assert(self->capacity != NULL); return self->size(self) == self->capacity(self); } @@ -307,12 +310,6 @@ bool queue_init(struct _queue * queue, uint32_t obj_size) return false; } - // The queue is only initialized once - if(queue->_obj_size != 0) - { - return false; - } - // attribute init queue->_size = 0; queue->_obj_size = obj_size; @@ -330,13 +327,19 @@ bool queue_init(struct _queue * queue, uint32_t obj_size) queue->empty = queue_empty; queue->full = queue_full; queue->size = queue_size; + queue->capacity = queue_capacity; queue->destory = queue_destory; queue->print = queue_print; + // 防止多次调用init导致内存泄漏 + queue->destory(queue); + // init front & back queue->_front = NULL; queue->_back = NULL; + + return true; } bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity) @@ -349,12 +352,6 @@ bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity) return false; } - // The queue is only initialized once - if(queue->_obj_size != 0) - { - return false; - } - // attribute init queue->_size = 0; queue->_obj_size = obj_size; @@ -377,6 +374,11 @@ bool queue_init2(struct _queue * queue, uint32_t obj_size, uint32_t capacity) queue->destory = queue2_destory; queue->print = queue2_print; + // 防止多次调用init导致内存泄漏 + queue->_front = NULL; + queue->_back = NULL; + queue->destory(queue); + // init front & back queue->_front = (struct _queue_node *)malloc(sizeof(struct _queue_node)); if(queue->_front == NULL) diff --git a/test/test_queue.c b/test/test_queue.c index 7b79135..f164579 100644 --- a/test/test_queue.c +++ b/test/test_queue.c @@ -33,7 +33,7 @@ static void test_queue_init(void) TEST_ASSERT_FALSE(queue_init(NULL, sizeof(int))); TEST_ASSERT_FALSE(queue_init(queue, 0)); TEST_ASSERT_TRUE(queue_init(queue, sizeof(int))); - TEST_ASSERT_FALSE(queue_init(queue, sizeof(int))); // The queue is only initialized once + TEST_ASSERT_TRUE(queue_init(queue, sizeof(char))); queue_free(&queue); // ------------------------------ @@ -42,7 +42,7 @@ static void test_queue_init(void) TEST_ASSERT_FALSE(queue_init2(queue, 0, 1)); TEST_ASSERT_FALSE(queue_init2(queue, sizeof(int), 0)); TEST_ASSERT_TRUE(queue_init2(queue, sizeof(int), 1)); - TEST_ASSERT_FALSE(queue_init2(queue, sizeof(int), 1)); // The queue is only initialized once + TEST_ASSERT_TRUE(queue_init2(queue, sizeof(int), 5)); queue_free(&queue); } @@ -56,7 +56,8 @@ static void test_queue_push(void) queue_t queue = NULL; - // ------------------------------ queue = queue_new(); + // ------------------------------ + queue = queue_new(); queue_init(queue, sizeof(int)); TEST_ASSERT_TRUE(queue->empty(queue)); for(i = 0; i < len; i++)