libevent:是否允许释放其回调函数中的事件,如果事件是由malloc创建的
问题描述:
我需要使用malloc
创建事件,但我不知道它在哪里释放它们,我想知道 是否它允许释放事件的回调函数内,如:libevent:是否允许释放其回调函数中的事件,如果事件是由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
指出的内容)。由超时指向的内容如何?应该由超时指向的内容覆盖事件循环吗?
答
你第一个假设是错误的,libevent的隐式调用event_del()
之前调用回调函数,而不是后(鉴于EV_PERSIST标志没有被设置)。因此,如果未设置EV_PERSIST标志,则在回调中释放pkt_ev没有问题。如果已设置,则需要先明确呼叫event_del()
。
关于你的第二个问题,不,在超时返回event_add()
之前复制超时指向的内容。