From 25db5e96a3d88b8ba7d26315d5bb07d37d72eafb Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 6 May 2020 11:11:57 +0000 Subject: [PATCH] strings.builder: fix a memory leak --- vlib/strings/builder.c.v | 2 +- vlib/v/gen/cgen.v | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/vlib/strings/builder.c.v b/vlib/strings/builder.c.v index c59718ca84..00739206a4 100644 --- a/vlib/strings/builder.c.v +++ b/vlib/strings/builder.c.v @@ -106,7 +106,7 @@ pub fn (b mut Builder) free() { } // QTODO checker bug s := b.initial_size - b.buf = []byte{cap: s} + //b.buf = []byte{cap: s} b.len = 0 b.str_calls = 0 } diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 1af035a062..919cd83174 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -3310,7 +3310,7 @@ fn (mut g Gen) gen_str_for_array(info table.Array, styp, str_fn_name string) { g.auto_str_funcs.writeln('\t\tstring x = ${field_styp}_str(it);') } g.auto_str_funcs.writeln('\t\tstrings__Builder_write(&sb, x);') - if info.elem_type != table.bool_type { + if g.pref.autofree && info.elem_type != table.bool_type { // no need to free "true"/"false" literals g.auto_str_funcs.writeln('\t\tstring_free(x);') } @@ -3319,7 +3319,10 @@ fn (mut g Gen) gen_str_for_array(info table.Array, styp, str_fn_name string) { g.auto_str_funcs.writeln('\t\t}') g.auto_str_funcs.writeln('\t}') g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos3("]"));') - g.auto_str_funcs.writeln('\treturn strings__Builder_str(&sb);') + g.auto_str_funcs.writeln('\tstring res = strings__Builder_str(&sb);') + g.auto_str_funcs.writeln('\tstrings__Builder_free(&sb);') + // g.auto_str_funcs.writeln('\treturn strings__Builder_str(&sb);') + g.auto_str_funcs.writeln('\treturn res;') g.auto_str_funcs.writeln('}') }