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 リストが無効になります。

この問題の解決策はnew、C++ を介して、またはmalloc(remember to deleteor free!) を使用して、ヒープ上に ITEM リストを作成することです。もう 1 つのオプションは、MENU をクラスでラップし、ITEM リストをメンバー変数として保持することです。

最も簡単な解決策は、MENU (または ITEM リスト) をグローバルにすることです。

于 2013-07-16T15:52:09.537 に答える