ncurses库的del_panel函数导致segfault

时间:2019-02-24 13:10:48

标签: c ncurses curses

我有一个代码,可以在一个功能中使用 new_panel 分配面板,并尝试在另一个功能中使用 del_panel 取消分配面板。代码示例如下

void medical_cards(int regid){ //work with patient's medical cards
/*...*/
PANEL *pmedcards[cards];
WINDOW *wmedcards[cards];

bind_windows(pmedcards, wmedcards, cards); 
//this function allocates panels
/*...*/
update_panels();
doupdate();

/*...*/

i = 0;
while (i < cards)
   del_panel(pmedcards[i++]); 
  /*here I get segfault with backtrace pointing 
  to wtouchln function of the ncurses library*/
i = 0;
while (i < cards)
    delwin(wmedcards[i++]);
return;
}

void bind_windows(PANEL **pmedcards, WINDOW **wmedcards, int cards){ 
int height = 15, width = 40, ypos = LINES - 20, xpos = COLS - 45;

int i = 0;
while (i < cards) {
    wmedcards[i] = newwin(height, width, ypos, xpos + i);
    box(wmedcards[i++], 0, 0);
}
i = 0;
while (i < cards) 
    pmedcards[i] = new_panel(wmedcards[i++]);
}

问题是我在尝试取消分配面板,调试器时遇到段错误 指向 wtouchln 功能会引起麻烦。似乎以前没有人遇到过这样的问题,手册页对 del_panel 函数的描述很少,希望能提供帮助。我期望的是del_panel将完成其释放资源并正常返回的工作,而不会导致程序崩溃。

2 个答案:

答案 0 :(得分:0)

pmedcards[i] = new_panel(wmedcards[i++]);

第一个i或i ++是什么?这是UB。

答案 1 :(得分:0)

问题与 ncurses 库无关,正如Michal Marszalek指出的那样,这是一个愚蠢的错误,分配新面板时会导致未定义的行为。问题解决了