2012-01-05 11 views
2

長時間の読者初回質問質問者。 私はfutureEvents.getNextEvent()のようなものに行きたいと思うFutureEventクラスのオブジェクトのリストを持っています。これは現在、私はこれが私の主要なメモリリークの原因であると私は思う新しい呼び出しのために動作します。どんな助けでも大歓迎です。そうでなければ、ポインタを次のイベントに戻すことができます。あなたはこの関数の結果どこにもないdeleteを行う場合のおかげリストからオブジェクトへのポインタを返す

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

答えて

3

が、これは確かにメモリリークの原因です。

考えられる解決策は次のとおりです。

  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; 
    } 
    

    あなたはboost::shared_ptrのように、ブーストでスマートポインタのいずれかを使用することができますstd::unique_ptrあなたのコンパイラがサポートしていない場合

+0

また、コードを整理するのに役立つメソッドパラメータにEVENT *を設定することもできます。メソッドを呼び出す人は、結果を格納するためのデータ構造を提供する必要があります。つまり、メモリを割り当てて解放することになります。 –

+0

ありがとうございました。大いに感謝しています –

+0

http://www.cplusplus.com/reference/stl/list/pop_front/によると、pop_frontを呼び出すと削除される要素のデストラクタが呼び出されます。このポイントの後にオブジェクトにアクセスすると、未定義の動作が発生する可能性があります。 – dtyler

関連する問題