From 00ea2e2ad34edd202f58d9a1eea2081f0905f9f2 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Thu, 23 Nov 2017 21:56:19 -0500 Subject: [PATCH] Fix memory leak in list_available_thread_groups Commit C++ify osdata 479f8de1b3b7e69ca8d557bbe9d843c7d1bc89c5 introduced a memory leak. We allocate std::vectors and insert them in a map, but never free them. Instead, the map value type can be std::vector objects directly. gdb/ChangeLog: * mi/mi-main.c (list_available_thread_groups): Change map value type to std::vector. --- gdb/ChangeLog | 5 +++++ gdb/mi/mi-main.c | 22 ++++++---------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bb3bf4e..ef19cf4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2017-11-23 Simon Marchi + * mi/mi-main.c (list_available_thread_groups): Change map value + type to std::vector. + +2017-11-23 Simon Marchi + * osdata.c (osdata_end_column, get_osdata): Remove std::move. 2017-11-23 Simon Marchi diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index c7db478..3ca3500 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -716,7 +716,7 @@ list_available_thread_groups (const std::set &ids, int recurse) /* This keeps a map from integer (pid) to vector of struct osdata_item. The vector contains information about all threads for the given pid. */ - std::map *> tree_; + std::map> tree; /* get_osdata will throw if it cannot return data. */ std::unique_ptr data = get_osdata ("processes"); @@ -729,18 +729,8 @@ list_available_thread_groups (const std::set &ids, int recurse) { const std::string *pid = get_osdata_column (item, "pid"); int pid_i = strtoul (pid->c_str (), NULL, 0); - std::vector *vec; - auto n = tree_.find (pid_i); - if (n == tree_.end ()) - { - vec = new std::vector; - tree_[pid_i] = vec; - } - else - vec = n->second; - - vec->push_back (item); + tree[pid_i].push_back (item); } } @@ -774,14 +764,14 @@ list_available_thread_groups (const std::set &ids, int recurse) if (recurse) { - auto n = tree_.find (pid_i); - if (n != tree_.end ()) + auto n = tree.find (pid_i); + if (n != tree.end ()) { - std::vector *children = n->second; + std::vector &children = n->second; ui_out_emit_list thread_list_emitter (uiout, "threads"); - for (const osdata_item &child : *children) + for (const osdata_item &child : children) { ui_out_emit_tuple tuple_emitter (uiout, NULL); const std::string *tid = get_osdata_column (child, "tid"); -- 2.7.4