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]);

このポインターをキャストする方法が原因で、メモリリークが発生しますか? ありがとう!

4

2 に答える 2

2

いいえ、漏れません。どのようにキャストしても問題ありません。重要なことは、割り当てたのと同じタイプを削除することです。あなたは と一致BYTE[]したBYTE[]ので、それはあなたの問題ではありません。

于 2012-04-06T16:12:50.687 に答える
1

あなたのコードはメモリをリークしませんが、不要なことをしています。

  1. 割り当てが失敗した場合に返される代わりに がスローされるため、 nullptrafterのチェックnewは無意味です。std::bad_allocnullptr
  2. 同様に、は完全に有効であるため、 nullptrbeforeのチェックdeleteは不要です。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
于 2012-04-06T16:26:51.537 に答える