我需要使用malloc
创建事件,但我不知道在哪里释放它们,我想知道
是否允许在其回调函数中释放事件,例如:
struct event *pkt_ev = (struct event *)malloc(sizeof(struct event));
evtimer_set(&pkt_ev, timer_cb, &pkt_ev);
event_base_set(base, &pkt_ev);
event_add(&pkt_ev, timeout);
回调函数timer_cb():
timer_cb(int fd, short ev, void* arg){
.......
free(arg); // here the arg is &pkt_ev
}
我最初的想法是:在调用回调函数timer_cb()
之后,libevent将隐式调用event_del(&pkt_ev)
。但是由于我在回调中释放了&pkt_ev
,因此event_del(&pkt_ev)
上会出现崩溃/异常。是不是?
但是,如果event_del(&pkt_ev)
不关心pkt_ev
指向的内容,那可能不是问题吗?
此外,在此功能中:
event_add(struct event *ev, struct timeval *timeout);
ev
指向的内容应该受到很多关注,一般应该是一个全局变量,或者它的生命周期应该覆盖事件循环(即,当事件循环函数运行时,它将访问指向的内容由ev
)。超时指向的内容怎么样?超时指向的内容是否应该覆盖事件循环?
答案 0 :(得分:0)
你首先假设是错误的,libevent在调用回调函数之前隐式调用event_del()
,而在之后调用(假设没有设置EV_PERSIST标志) 。因此,如果未设置EV_PERSIST标志,则在回调中释放pkt_ev没有问题。如果已设置,则需要首先明确调用event_del()
。
关于你的第二个问题,不,在event_add()
返回之前复制超时指向的内容。