From 2306ad46dce1c53b0b1bfabdc04d70e3b99eabb7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 4 Jul 2014 18:09:29 -0400 Subject: [PATCH] [util] Fix memory issue --- util/options.cc | 6 ++---- util/options.hh | 9 +++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/util/options.cc b/util/options.cc index f872bb4b..c65888ef 100644 --- a/util/options.cc +++ b/util/options.cc @@ -371,15 +371,15 @@ void output_options_t::add_options (option_parser_t *parser) { const char *text; - char *text_free = NULL; if (NULL == supported_formats) text = "Set output format"; else { char *items = g_strjoinv ("/", const_cast (supported_formats)); - text = text_free = g_strdup_printf ("Set output format\n\n Supported formats are: %s", items); + text = g_strdup_printf ("Set output format\n\n Supported output formats are: %s", items); g_free (items); + parser->free_later ((char *) text); } GOptionEntry entries[] = @@ -393,8 +393,6 @@ output_options_t::add_options (option_parser_t *parser) "Output options:", "Options controlling the output", this); - - g_free (text_free); } diff --git a/util/options.hh b/util/options.hh index a236a5df..44377074 100644 --- a/util/options.hh +++ b/util/options.hh @@ -85,11 +85,14 @@ struct option_parser_t memset (this, 0, sizeof (*this)); usage_str = usage; context = g_option_context_new (usage); + to_free = g_ptr_array_new (); add_main_options (); } ~option_parser_t (void) { g_option_context_free (context); + g_ptr_array_foreach (to_free, (GFunc) g_free, NULL); + g_ptr_array_free (to_free, TRUE); } void add_main_options (void); @@ -100,6 +103,10 @@ struct option_parser_t const gchar *help_description, option_group_t *option_group); + void free_later (char *p) { + g_ptr_array_add (to_free, p); + } + void parse (int *argc, char ***argv); G_GNUC_NORETURN void usage (void) { @@ -107,8 +114,10 @@ struct option_parser_t exit (1); } + private: const char *usage_str; GOptionContext *context; + GPtrArray *to_free; }; -- GitLab