删除指向不同指针类型的复制指针是否会导致内存泄漏

Does deleting copied pointers to differing pointer types cause a memory leak?

本文关键字:指针 是否 泄漏 内存 复制 类型 删除      更新时间:2023-10-16

我已经在我的应用程序中缩小了我的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]);

这会导致内存泄漏吗,因为我如何投射这个指针?谢谢!

不,这不会泄漏。不管你如何投射它,重要的是你删除你分配的相同类型。您已将BYTE[]BYTE[]匹配,所以这不是您的问题。

你的代码不会泄漏内存,但你正在做一些不必要的事情。

  1. new后检查nullptr毫无意义,因为如果分配失败,则会抛出std::bad_alloc而不是返回nullptr
  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