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. 检查nullptrafternew是没有意义的,因为如果分配失败std::bad_alloc,则会抛出而不是返回。nullptr
  2. 同样,检查nullptrbeforedelete是不必要的,因为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 回答