libevent:如果事件是由malloc创建的,它是否允许在其回调函数中释放一个事件

我需要使用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)上会出现崩溃/exception。 这样对吗?

但是,如果event_del(&pkt_ev)不关心pkt_ev指向的内容,那可能不是问题吗?

此外,在这个function:

  event_add(struct event *ev, struct timeval *timeout); 

ev指出的内容应该关注很多,一般应该是一个全局变量,或者它的生命周期应该覆盖事件循环(即,当事件循环函数运行时,它将访问ev指向的内容)。 超时指向的内容怎么样? 超时指向的内容是否应覆盖事件循环?

你首先假设是错误的,libevent 调用回调函数之前隐式调用event_del() ,而不是之后 (假设没有设置EV_PERSIST标志)。 因此,如果未设置EV_PERSIST标志,则在回调中释放pkt_ev没有问题。 如果已设置,则需要首先明确调用event_del()

关于你的第二个问题,不,在event_add()返回之前复制超时指向的内容。