簡體   English   中英

刪除指向不同指針類型的復制指針是否會導致 memory 泄漏?

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

我在我的應用程序中縮小了我的 AVI 視頻播放器正在泄漏 memory 的范圍。我有以下代碼:

...

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]);

這會因為我如何轉換這個指針而導致 memory 泄漏嗎? 謝謝!

不,那不會泄漏。 你如何轉換它並不重要,重要的是你刪除了你分配的相同類型。 您已將BYTE[]BYTE[] ] 匹配,所以這不是您的問題。

您的代碼不會泄漏 memory,但您正在做一些不必要的事情。

  1. new之后檢查nullptr是沒有意義的,因為如果分配失敗,將拋出std::bad_alloc而不是返回nullptr
  2. 同樣, delete之前檢查nullptr是不必要的,因為delete [] nullptr是完全有效的。

此外,使用智能指針而不是管理指向 memory 原始塊的指針。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM