1

我需要使用创建事件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)。timeout指向的内容呢?timeout 指向的内容是否应该覆盖事件循环?

4

1 回答 1

0

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

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

于 2013-05-24T08:55:54.177 回答