2012-01-05 73 views
2

長時間讀寫器第一次提問問題。 我有一個FutureEvent類中的對象列表,我希望能夠像futureEvents.getNextEvent()一樣。這是目前我有哪些工作,但因爲新的呼籲,我認爲這是我的主要內存泄漏的原因。任何幫助將不勝感激。我還能如何返回指向下一個事件的指針。由於從列表中返回指向對象的指針

EVENT* FutureEvent::getNextEvent() 
{ 
EVENT* nextEvent = new EVENT; 
*nextEvent = futureEvents.front(); 
futureEvents.pop_front(); 
return nextEvent; 
} 

回答

3

如果不delete此函數的結果的任何地方,這無疑是一個內存泄漏的原因。

可能的解決方案包括:

  1. 返回由值

    通過這種方法,你甚至都不需要使用動態分配(即new)。你只使用自動對象,所以你不需要清理:他們使用的內存被自動釋放,任何析構函數都會自動調用。

    EVENT FutureEvent::getNextEvent() { 
        EVENT nextEvent = futureEvents.front(); 
        futureEvents.pop_front(); 
        return nextEvent; 
    } 
    
  2. 使用智能指針

    這種方法仍然使用動態分配的,但它代表到可以自動清理的護理類。

    std::unique_ptr<EVENT> FutureEvent::getNextEvent() { 
        std::unique_ptr<EVENT> nextEvent(new EVENT(futureEvents.front())); 
        futureEvents.pop_front(); 
        return nextEvent; 
    } 
    

    如果你的編譯器不支持std::unique_ptr您可以在升壓使用智能指針之一,像boost::shared_ptr

+0

您也可以在方法參數中有EVENT *,這有助於組織代碼。調用方法的人需要提供數據結構來存儲結果,這意味着他分配內存並負責釋放內存。 – 2012-01-05 22:47:29

+0

非常感謝通過價值解決了我的問題。非常感謝 – 2012-01-05 22:50:21

+0

根據http://www.cplusplus.com/reference/stl/list/pop_front/,調用pop_front將調用被刪除元素的析構函數。在此點之後保持對象的訪問可能導致未定義的行爲。 – dtyler 2012-01-05 22:52:11