sled

Једноставни уређивач текста
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

чување f9597f258c447021a444ccffe70082ebc9a12a66
родитељ 7a652755a9d5c953d5fa9fc8a31a19459a1d1509
Аутор: Страхиња Радић <contact@strahinja.org>
Датум:   Sun, 27 Feb 2022 17:08:34 +0100

Avoid memory leak when rereading the file

Signed-off-by: Страхиња Радић <contact@strahinja.org>

Diffstat:
Mdraw.c | 11+++++++----
Mdraw.h | 2+-
Msled.c | 10++--------
измењених датотека: 3, додавања: 10(+), брисања: 13(-)

diff --git a/draw.c b/draw.c @@ -138,15 +138,18 @@ init_drawstate(struct DrawState* state, char* error, char* action, } void -free_drawstate(struct DrawState* state) +free_drawstate(struct DrawState* state, int skip_paste_free) { size_t row = 0; for (row = 0; row < state->buffer_size; row++) free_bufferline(state->buffer + row); free(state->buffer); - for (row = 0; row < state->paste_size; row++) - free_bufferline(state->paste + row); - free(state->paste); + if (!skip_paste_free) + { + for (row = 0; row < state->paste_size; row++) + free_bufferline(state->paste + row); + free(state->paste); + } free(state->input); } diff --git a/draw.h b/draw.h @@ -90,7 +90,7 @@ void init_bufferline(struct BufferLine* bl); void free_bufferline(struct BufferLine* bl); void init_drawstate(struct DrawState* state, char* error, char* action, char* filename, char* prompt, int skip_paste_and_mode_init); -void free_drawstate(struct DrawState* state); +void free_drawstate(struct DrawState* state, int skip_paste_free); size_t display_length(const struct DrawState* state, uint32_t* buffer, const size_t max_index); size_t buffer_length(const struct DrawState* state, uint32_t* buffer, diff --git a/sled.c b/sled.c @@ -594,15 +594,9 @@ reread_file(struct DrawState* state) { long lineno = 1; long col = 1; - size_t row = 0; int result; - for (row = 0; row < state->buffer_size; row++) - free_bufferline(state->buffer + row); - free(state->buffer); - /*for (row = 0; row < state->paste_size; row++) - free_bufferline(state->paste + row); - free(state->paste);*/ + free_drawstate(state, 1); init_drawstate(state, state->error, state->action, state->filename, state->prompt, 1); @@ -1783,6 +1777,6 @@ init_termbox: if (state.error && *state.error) return print_error(1, state.error); - free_drawstate(&state); + free_drawstate(&state, 0); return 0; }