gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:46 24 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c - libevent:如果事件是由 malloc 创建的,是否允许在其回调函数中释放事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16691188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com