为什么在单独的函数中创建 ncurses 小部件时不能正常工作?
Why don't ncurses widgets work properly when created in a separate function?
我正试图使用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
(记住delete
或free
!)在堆上创建ITEM列表。另一个选项是将MENU封装在类中,并将ITEM列表作为成员变量。
最简单的解决方案是将MENU(或ITEM列表)设置为全局。
未定义的行为:new_menu
需要一个以NULL结尾的ITEM*
数组作为输入,而需要一个menu_items.push_back(0);
。
相关文章:
- 为什么 HeapFree() 不能正常工作?
- std::unique_ptr 在 GCC 中工作,但不能在 Visual Studio 中编译
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 为什么"std::is_function_v"不能按预期工作?
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- C++自定义删除运算符不能正常工作?
- 为什么使用 exec() 重新启动程序不能正常工作?
- C++:返回本地对象,但不能正常工作
- 有没有办法关闭文件? fclose 不能很好地工作
- 为什么我不能声明一个 constexpr 本地,而一个 const 一个工作?
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 为什么带lcov的codecov在Travis上不能正常工作,而在我当地的Linux Mint上却不能正常工作
- 为什么sizeof函数在这里不能正常工作
- 为什么 decltype(declval()<T>.func()) 可以工作,而 decltype(&T::func) 不能工作?
- 静态 constexpr 函数在模板结构中工作,但不能在结构中工作.为什么?
- 为什么这个base64解码/编码功能不能正常工作?
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 如果 (QString.contains()) 不能正常工作,请使用 temp bool 变量进行更正