diff --git a/src/zcatconfig.zig b/src/zcatconfig.zig index 6d2a746..c537b49 100644 --- a/src/zcatconfig.zig +++ b/src/zcatconfig.zig @@ -390,6 +390,13 @@ pub fn Engine(comptime variables: []const ConfigVariable, comptime ConfigType: t // IMPORTANTE: Duplicar el string porque 'value' apunta a 'content' // que se libera con defer al final de load() if (@hasDecl(ConfigType, "dupeString")) { + // Liberar string anterior si existe (evitar leak en hot-reload) + if (@hasDecl(ConfigType, "freeString")) { + const old_val = @field(config.*, v.name); + if (old_val.len > 0) { + _ = config.freeString(old_val); + } + } // Config tiene método para trackear strings alocados @field(config.*, v.name) = config.dupeString(value) catch value; } else if (@hasField(ConfigType, "allocator")) { @@ -409,6 +416,13 @@ pub fn Engine(comptime variables: []const ConfigVariable, comptime ConfigType: t // String que representa un color (nombre de paleta) // También necesita duplicarse if (@hasDecl(ConfigType, "dupeString")) { + // Liberar string anterior si existe (evitar leak en hot-reload) + if (@hasDecl(ConfigType, "freeString")) { + const old_val = @field(config.*, v.name); + if (old_val.len > 0) { + _ = config.freeString(old_val); + } + } @field(config.*, v.name) = config.dupeString(value) catch value; } else if (@hasField(ConfigType, "allocator")) { @field(config.*, v.name) = config.allocator.dupe(u8, value) catch value;