From 15b698ea33f5a4533392143357cc758a97ac467d Mon Sep 17 00:00:00 2001 From: lixianjing Date: Wed, 9 Apr 2025 18:09:36 +0800 Subject: [PATCH] fix memory leak --- docs/changes.md | 1 + src/base/text_edit.c | 34 ++++++++++++++++++++++------------ 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 6774a588b..426e52aeb 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -4,6 +4,7 @@ * 添加可从xml中解析本地化信息的locale_info,完善预览程序可从strings.xml获取翻译文本(感谢培煌提供补丁) * 完善object_hash(感谢兆坤提供补丁) * 修复拼写错误(感谢兆坤提供补丁) + * 修复text_edit内存泄露(感谢泽武提供补丁) 2025/04/08 * 增加 rectf_intersect (感谢智明提供补丁) diff --git a/src/base/text_edit.c b/src/base/text_edit.c index df7ecd4a0..1eb3cec36 100644 --- a/src/base/text_edit.c +++ b/src/base/text_edit.c @@ -636,7 +636,7 @@ static ret_t text_edit_row_transfer(text_edit_t* text_edit, uint32_t start, uint if (forward) { for (i = start; i < interval + start; i++) { row = impl->rows->row + i; - darray_clear(&row->info); + darray_deinit(&row->info); } for (i = start; i < impl->rows->size - interval; i++) { row = impl->rows->row + i; @@ -649,18 +649,25 @@ static ret_t text_edit_row_transfer(text_edit_t* text_edit, uint32_t start, uint row->line_num = row_temp->line_num; row->info = row_temp->info; } + for (; i < impl->rows->size; i++) { + row = impl->rows->row + i; + row->length = 0; + row->line_num = 1; + darray_init(&row->info, 4, default_destroy, NULL); + darray_push(&row->info, TKMEM_ZALLOC(line_info_t)); + } } else { for (i = impl->rows->size + interval; i > impl->rows->size; i--) { - if (i > impl->rows->capacity || (overwrite && i <= impl->rows->size + rm_row_num)) { + if (i > impl->rows->capacity || (overwrite && i <= impl->rows->size)) { continue; } row = impl->rows->row + i - 1; - darray_clear(&row->info); + darray_deinit(&row->info); } for (i = impl->rows->size; i > start + 1; i--) { row = impl->rows->row + i - 1; if (i + interval > impl->rows->capacity) { - darray_clear(&row->info); + darray_deinit(&row->info); continue; } row_temp = impl->rows->row + i + interval - 1; @@ -672,6 +679,13 @@ static ret_t text_edit_row_transfer(text_edit_t* text_edit, uint32_t start, uint row_temp->line_num = row->line_num; row_temp->info = row->info; } + for (; i < start + interval + 1; i++) { + row = impl->rows->row + i; + row->length = 0; + row->line_num = 1; + darray_init(&row->info, 4, default_destroy, NULL); + darray_push(&row->info, TKMEM_ZALLOC(line_info_t)); + } } return RET_OK; } @@ -755,6 +769,7 @@ ret_t text_edit_muti_line_insert_text_layout(text_edit_t* text_edit, uint32_t of row = impl->rows->row + i; row->length = row_tmp[i].length; row->line_num = row_tmp[i].line_num; + darray_deinit(&row->info); row->info = row_tmp[i].info; } impl->rows->size = impl->rows->size + row_num - row_num_tmp; @@ -769,7 +784,7 @@ ret_t text_edit_muti_line_insert_text_layout(text_edit_t* text_edit, uint32_t of } if (row_num < layout_row_num) { for (i = row_num; i < layout_row_num; i++) { - darray_clear(&row_tmp[i].info); + darray_deinit(&row_tmp[i].info); } } TKMEM_FREE(row_tmp); @@ -863,20 +878,15 @@ ret_t text_edit_muti_line_insert_text_layout(text_edit_t* text_edit, uint32_t of text_edit_row_transfer(text_edit, row_num, insert_row_num, FALSE, insert_length, overwrite, rm_row_num); - row = impl->rows->row + row_num; - if (row_num < impl->rows->capacity) { - if (!overwrite || row_num >= impl->rows->size + rm_row_num) { - darray_clear(&row->info); - } - } for (i = 0; i < layout_row_num; i++) { if (i + row_num > impl->rows->capacity) { - darray_clear(&row_tmp[i].info); + darray_deinit(&row_tmp[i].info); continue; } row = impl->rows->row + i + row_num; row->length = row_tmp[i].length; row->line_num = row_tmp[i].line_num; + darray_deinit(&row->info); row->info = row_tmp[i].info; }