我在我的应用程序中缩小了我的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]);
这会导致内存泄漏,因为我是如何投射这个指针的吗?谢谢!
答案 0 :(得分:2)
不,那不会泄漏。无论你如何转换它,重要的是你删除你分配的相同类型。您已将BYTE[]
与BYTE[]
匹配,因此这不是您的问题。
答案 1 :(得分:1)
您的代码不会泄漏内存,但您正在做一些不必要的事情。
nullptr
之后检查new
是没有意义的,因为如果分配失败,则抛出std::bad_alloc
而不是返回nullptr
。nullptr
完全有效,因此无需在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