【问题标题】:Does deleting copied pointers to differing pointer types cause a memory leak?删除指向不同指针类型的复制指针会导致内存泄漏吗?
【发布时间】:2012-04-06 16:09:09
【问题描述】:

我在我的应用程序中发现我的 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]);

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

【问题讨论】:

  • 不,对象在被删除时知道自己的大小,而不管任何转换。作为旁注,不需要检查是否与 NULL 不同,因为删除 NULL 指针是完全有效的。

标签: c++ memory pointers memory-leaks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 谢谢,但是我已经重载了 new 操作符,所以它会在失败的情况下返回 NULL。这就是它在那里的原因。你的第二点是有效的。
    猜你喜欢
    • 2021-06-14
    • 2014-05-10
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2012-08-10
    • 2023-03-06
    相关资源
    最近更新 更多