delwin(stdscr) 合法吗?

Is delwin(stdscr) legal?

如果合法的话,我退出ncurses的时候应该一直调用吗?还是从endwin()?自动调用delwin(stdscr)?

会有什么后果

这是多个问题:

  • If it is legal, should I call this always when exiting from ncurses?
  • Or is it automatically called from endwin()?
  • What are the consequences of doing delwin(stdscr)?

前两个是等价的(在 curses 的任何实现中都不是必需的,endwin 也不是)。那么就称之为两个问题。第一个问 delwinendwin 有什么关系,另一个问 [=54= 的具体行为]delwin。后者很有趣。

实际上它可能依赖于实现。

将其限制为 ncurses(每个标签),

  • delwin 调用
  • _nc_freewin,调用
  • remove_window_from_screen,对每个curscrnewscr进行特殊检查和 stdscr(如果要删除的 window 恰好匹配,则在释放它们各自的数据之前,将这些全局变量的值设置为 NULL)。

所以它适用于 ncurses。我在 December 1996:

中添加了该功能
    + modify _nc_freewin() to reset globals curscr/newscr/stdscr when
      freeing the corresponding WINDOW (found using Purify).

关于便携性:

有两个问题。另一个问候endwin。这永远不会删除 window,因为总是可以在调用 endwin 之后调用 wrefresh。它在 manual page:

   Calling refresh(3x) or doupdate(3x) after a temporary escape causes the
   program to resume visual mode.

但是,如果您在 endwin()wrefresh(stdscr) 调用之间执行了 delwin(stdscr) , ncurses 会 return 后者的错误。 NetBSD(read the code 看到它将取消引用空指针)和 Solaris 都会转储核心。