2012-04-06 62 views
1

我在我的應用程序中縮小了我的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

不,對象在被刪除時知道自己的大小,不管任何投射。作爲旁註,不需要檢查是否與NULL不同,因爲NULL指針的刪除完全有效。 – oddstar 2012-04-06 16:11:34

回答

2

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

1

你的代碼不會泄漏內存,但你正在做一些不必要的事情。因爲std::bad_alloc代替拋出nullptr,如果分配失敗返回new

  1. 檢查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 
+0

謝謝,但是我重載了新的操作符,所以它會在失敗的情況下返回NULL。這就是爲什麼它在那裏。你的第二點是有效的。 – Balk 2012-04-06 17:14:58