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

时间:2012-04-06 16:09:09

标签: c++ memory pointers memory-leaks

我在我的应用程序中缩小了我的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 个答案:

答案 0 :(得分:2)

不,那不会泄漏。无论你如何转换它,重要的是你删除你分配的相同类型。您已将BYTE[]BYTE[]匹配,因此这不是您的问题。

答案 1 :(得分:1)

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

  1. nullptr之后检查new是没有意义的,因为如果分配失败,则抛出std::bad_alloc而不是返回nullptr
  2. 同样,由于nullptr完全有效,因此无需在delete之前检查delete [] nullptr
  3. 此外,使用智能指针而不是管理指向原始内存块的指针。

    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