2013-05-22 43 views
1

我需要使用malloc創建事件,但我不知道它在哪裏釋放它們,我想知道 是否它允許釋放事件的回調函數內,如:libevent:是否允許釋放其回調函數中的事件,如果事件是由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指出的內容)。由超時指向的內容如何?應該由超時指向的內容覆蓋事件循環嗎?

回答

0

你第一個假設是錯誤的,libevent的隱式調用event_del()之前調用回調函數,而不是(鑑於EV_PERSIST標誌沒有被設置)。因此,如果未設置EV_PERSIST標誌,則在回調中釋放pkt_ev沒有問題。如果已設置,則需要先明確呼叫event_del()

關於你的第二個問題,不,在超時返回event_add()之前複製超時指向的內容。

相關問題