![](/img/trans.png)
[英]Will not deleting a pointer in destructor cause memory leak if reference should stick around?
[英]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,但您正在做一些不必要的事情。
new
之后檢查nullptr
是沒有意義的,因為如果分配失敗,將拋出std::bad_alloc
而不是返回nullptr
。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.