[util] Fix memory issue

This commit is contained in:
Behdad Esfahbod 2014-07-04 18:09:29 -04:00
parent 14a4a9d649
commit 2306ad46dc
2 changed files with 11 additions and 4 deletions

View File

@ -371,15 +371,15 @@ void
output_options_t::add_options (option_parser_t *parser) output_options_t::add_options (option_parser_t *parser)
{ {
const char *text; const char *text;
char *text_free = NULL;
if (NULL == supported_formats) if (NULL == supported_formats)
text = "Set output format"; text = "Set output format";
else else
{ {
char *items = g_strjoinv ("/", const_cast<char **> (supported_formats)); char *items = g_strjoinv ("/", const_cast<char **> (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); g_free (items);
parser->free_later ((char *) text);
} }
GOptionEntry entries[] = GOptionEntry entries[] =
@ -393,8 +393,6 @@ output_options_t::add_options (option_parser_t *parser)
"Output options:", "Output options:",
"Options controlling the output", "Options controlling the output",
this); this);
g_free (text_free);
} }

View File

@ -85,11 +85,14 @@ struct option_parser_t
memset (this, 0, sizeof (*this)); memset (this, 0, sizeof (*this));
usage_str = usage; usage_str = usage;
context = g_option_context_new (usage); context = g_option_context_new (usage);
to_free = g_ptr_array_new ();
add_main_options (); add_main_options ();
} }
~option_parser_t (void) { ~option_parser_t (void) {
g_option_context_free (context); 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); void add_main_options (void);
@ -100,6 +103,10 @@ struct option_parser_t
const gchar *help_description, const gchar *help_description,
option_group_t *option_group); option_group_t *option_group);
void free_later (char *p) {
g_ptr_array_add (to_free, p);
}
void parse (int *argc, char ***argv); void parse (int *argc, char ***argv);
G_GNUC_NORETURN void usage (void) { G_GNUC_NORETURN void usage (void) {
@ -107,8 +114,10 @@ struct option_parser_t
exit (1); exit (1);
} }
private:
const char *usage_str; const char *usage_str;
GOptionContext *context; GOptionContext *context;
GPtrArray *to_free;
}; };