为什么ncurses小部件在单独的函数中创建时不能正常工作?

时间:2013-07-11 18:55:48

标签: c++ ncurses curses

我正在尝试使用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
   */
}

2 个答案:

答案 0 :(得分:2)

我将为未来的搜索者回答这个问题。事实证明,new_menu采用指向ITEM列表的指针并挂起。如果ITEM列表位于函数的堆栈中,则在函数返回时它将被删除,从而使ITEM列表无效。

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

最简单的解决方案是将MENU(或ITEM列表)设为全局。

答案 1 :(得分:0)

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