2012-04-06 9 views
1

私のアプリケーションでは、私のAVIビデオプレーヤーがメモリをリークしていることを絞り込んだ。異なるポインタ型にコピーされたポインタを削除するとメモリリークが発生しますか?

... 

LPBYTE pChunk = new BYTE[lSize]; 
if(!pChunk) 
    return false; 

hr = AVIStreamReadFormat(pStream, AVIStreamStart(pStream), pChunk, &lSize); 
if(hr) 
{ 
    delete [] pChunk; 
    return false; 
} 

m_pVideoFormats[i] = (LPBITMAPINFO)pChunk; 

その後、それはビデオを削除するには時間が来るときに、私は単純に削除します:

if(m_pVideoFormats[i]) 
    delete [] ((LPBYTE)m_pVideoFormats[i]); 

このため、どのように私はこれをキャストてるのメモリリークが発生する私は、次のコードを持っていますポインタ周り?ありがとう!

+2

いいえ、オブジェクトは、キャストに関係なく、削除されると独自のサイズを認識します。 sidenoteとして、NULLポインタの削除が完全に有効であるため、NULLとは違うかどうかを確認する必要はありません。 – oddstar

答えて

2

いいえ、漏れません。どのようにキャストするかは関係ありません。重要なのは、割り当てた同じタイプを削除することです。あなたはBYTE[]BYTE[]をマッチさせているので、問題はありません。

1

あなたのコードはメモリをリークしませんが、あなたはいくつかの不必要なことをしています。 std::bad_allocは、割り当てが失敗した場合に返されるnullptrの代わりにスローされますので、

  1. newnullptrのチェックは無意味です。
  2. 同様にdelete [] nullptrが完全に有効であるため、deleteの前にnullptrをチェックする必要はありません。

また、メモリの生のチャンクへのポインタを管理する代わりに、スマートポインタを使用します。

std::unique_ptr<BYTE[]> pChunk; 

try { 
    pChunk.reset(new BYTE[lSize]); 
} catch(const std::bad_alloc&) { 
    return false; 
} 

hr = AVIStreamReadFormat(pStream, AVIStreamStart(pStream), pChunk, &lSize); 
if(hr) 
{ 
    // delete [] pChunk; // not needed - smart pointer will free memory 
    return false; 
} 

m_pVideoFormats[i] = (LPBITMAPINFO)pChunk.release(); 

... 

delete [] ((LPBYTE)m_pVideoFormats[i]); 
m_pVideoFormats[i] = nullptr; // set to nullptr to avoid double deletion 
+0

ありがとう、しかし、私は新しい演算子をオーバーロードしているので、失敗の場合はNULLを返します。それがそこにある理由です。あなたの2番目のポイントは有効です。 – Balk

関連する問題