0

我正在尝试使用 C++ 中的纯 ncurses 创建一系列嵌套菜单。如果我创建一个菜单并将其发布在 main() 中,它可以正常工作。但是,如果我采用相同的代码并将其放入返回 MENU* 的函数中,则它根本不起作用。我错过了什么吗?

有效的代码:

int main() 
{
  /*
   * snipped out the curses startup code
   */ 
  vector<char*> options;
  options.push_back("List");
  options.push_back("Add");
  options.push_back("Delete");
  options.push_back("Exit");

  vector<ITEM*> menu_items(options.size());
  for (int i = 0; i < options.size(); i++)
    menu_items[i] = new_item(options[i], NULL);

  MENU *options_menu;
  options_menu = new_menu(&menu_items[0]);

  set_menu_win(options_menu, main_window);
  set_menu_sub(options_menu, derwin(main_window, 6, 20, 3, 3));
  set_menu_mark(options_menu, ">");

  refresh();
  post_menu(options_menu); // this works fine
  wrefresh(main_window);
  /* 
   * snipped out the rest of the stuff
   */
}

不起作用的代码:

MENU *make_menu()
{
  /*
   * same as code in previous main()
   */

  return options_menu;
}

int main()
{
  /*
   * snip
   */

  MENU *options_menu = make_menu();
  refresh();
  post_menu(options_menu); // this doesn't do anything
  wrefresh(main_window);

  /*
   * snip
   */
}
4

2 回答 2

2

我会为未来的搜索者回答这个问题。事实证明,new_menu 需要一个指向 ITEM 列表的指针并挂在它上面。如果ITEM列表在函数的栈上,当函数返回时会被删除,使得ITEM列表无效。

这个问题的解决方案是在堆上创建 ITEM 列表,可以通过newC++ 或使用malloc(记住 todeletefree!)。另一种选择是将 MENU 包装在一个类中,并将 ITEM 列表保留为成员变量。

最简单的解决方案是使 MENU(或 ITEM 列表)全局化。

于 2013-07-16T15:52:09.537 回答
0

未定义的行为:new_menu需要一个以 NULL 结尾的数组ITEM*作为输入,您需要一个 menu_items.push_back(0);.

于 2013-07-11T19:01:18.790 回答