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 が指すコンテンツはイベント ループをカバーする必要がありますか?

4

1 に答える 1