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

Why don't ncurses widgets work properly when created in a separate function?

本文关键字:常工作 不能 工作 单独 函数 小部 ncurses 创建 为什么      更新时间:2023-10-16

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

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

这个问题的解决方案是通过C++中的new或使用malloc(记住deletefree!)在堆上创建ITEM列表。另一个选项是将MENU封装在类中,并将ITEM列表作为成员变量。

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

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

相关文章: