c-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_evevent_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()

关于您的第二个问题,否,timeout所指向的内容在event_add()返回之前被复制。

相关内容

  • 没有找到相关文章

最新更新