diff --git a/term_util.c b/term_util.c
index d16b78b..5a5c2f1 100644
--- a/term_util.c
+++ b/term_util.c
@@ -449,8 +449,16 @@ void qmenu_push_to_nav(Qmenu* qm) {
 void qmenu_free(Qmenu* qm) {
   unpost_menu(qm->ncurses_menu);
   free_menu(qm->ncurses_menu);
+  struct Qmenu_item_extra* extras = qmenu_item_extras_ptr(qm);
   for (Usz i = 0; i < qm->items_count; ++i) {
+    ITEM* item = qm->ncurses_items[i];
+    struct Qmenu_item_extra* extra = qmenu_itemextra(extras, item);
+    char const* freed_str = NULL;
+    if (extra->owns_string)
+      freed_str = item_name(item);
     free_item(qm->ncurses_items[i]);
+    if (freed_str)
+      free((void*)freed_str);
   }
   free(qm->ncurses_items);
   free(qm);