幾個內(nèi)存泄漏的例子_第1頁
幾個內(nèi)存泄漏的例子_第2頁
幾個內(nèi)存泄漏的例子_第3頁
幾個內(nèi)存泄漏的例子_第4頁
幾個內(nèi)存泄漏的例子_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、幾個內(nèi)存泄漏的例子 new和delete要成對使用 new和delete要匹配經(jīng)常看到一些C+方面的書籍中這樣提及到內(nèi)存泄漏問題,這樣的說法的意思是比較明白,但對于初學(xué)C+程序員還是很難掌握,所以下面舉幾個反面的例子,希望對大家有幫助。例一:錯誤處理流程中的return導(dǎo)致的內(nèi)存泄漏bool MyFun()CMyObject* pObj = NULL;pObj = new CMyObject();if ()return false;if()return false;if (pObj != NULL)delete pObj;return true;注意:紅色字體部分的return之前沒有釋放pO

2、bj,導(dǎo)致內(nèi)存泄漏。例二:exception改變了程序的正常流程,導(dǎo)致內(nèi)存泄漏情況1:HRESULT MyFun()HRESULT hr = S_OK;tryCMyObject* pObj = NULL;pObj = new CMyObject();if ()hr = E_FAIL;throw hr;if()hr = E_FAIL;throw hr;if (pObj != NULL)delete pObj;catch (HRESULT& eHr)return hr;情況2:void OtherFun()/ 可能是自己寫的其他函數(shù);/ 也可能是其他人寫的函數(shù);/ 也可能是系統(tǒng)的API;if()t

3、hrow exception;bool MyFun()CMyObject* pObj = NULL;pObj = new CMyObject();OtherFun();if (pObj != NULL)delete pObj;return true;注意:上面的兩種情況中的throw行為將導(dǎo)致程序的正常流程,一旦有throw的動作發(fā)生,pObj對象將不會被正確釋放(delete)。例三:忘記釋放系統(tǒng)API創(chuàng)建的資源,導(dǎo)致內(nèi)存泄露bool CMyClass:MyFun()HANDLE hHandle = CreateEvent(NULL,FALSE,TRUE,NULL);if ()return

4、false;return true;注意:系統(tǒng)API CreateEvent創(chuàng)建的HANDLE對象,需要自己釋放,否則會導(dǎo)致內(nèi)存泄漏。還有其他一些系統(tǒng)的API也是如此,如:CreateFile、CreateFileMapping等等,所以我們在使用不熟悉的系統(tǒng)API時,一定要仔細(xì)閱讀MSDN。例四:PostMessage可能導(dǎo)致的內(nèi)存泄漏/ 自定義的消息結(jié)構(gòu)體typedef struct tagMSGint i;float f;MSG;/ 發(fā)送消息的函數(shù)void MyFun()MSG* pMsg = new MSG;PostMessage(m_hWnd, WM_MYEVENT, (WPARAM

5、)pMsg, 0);/ 接收消息的函數(shù)afx_msg void OnMessage(WPARAM wParam, LPARAM lParam)MSG* pMsg = (MSG*)wParam;m_i = pMsg-i;m_f = pMsg-f;注意:OnMessage函數(shù)中忘記釋放pMsg,導(dǎo)致內(nèi)存泄漏。例五:函數(shù)返回new的對象而導(dǎo)致的內(nèi)存泄漏char* MyFun()char* p = new char10;return p;注意:調(diào)用MyFun程序的人可能不會注意到MyFun函數(shù)內(nèi)部new出的對象,往往會忽略對象p的釋放。例六:不好的類結(jié)構(gòu)也會導(dǎo)致內(nèi)存泄漏/ MyClass.h文件cla

6、ss MyClasspublic:MyClass();virtual MyClass();BOOL Init();BOOL UnInit();private:char* m_pStr;/ MyClass.cpp文件MyClass:MyClass(): m_pStr(NULL)MyClass:MyClass()BOOL MyClass:Init()m_pStr = new char100;if ()delete m_pStr;m_pStr = NULL;return FALSE;return TRUE;BOOL MyClass:UnInit()if (m_pStr != NULL)delete

7、m_pStr;m_pStr = NULL;return TRUE;注意:這個類在Init()函數(shù)中new出類資源,需要調(diào)用相應(yīng)的UnInit()函數(shù)來釋放資源,但有些時候這個類需要給其他人使用,別人在使用時可能會忘記調(diào)用UnInit()函數(shù)來釋放資源,這樣就造成了內(nèi)存泄漏,為了防止這個問題發(fā)生,最好在MyClass:MyClass()函數(shù)中也進(jìn)行資源釋放。如下寫法:MyClass:MyClass()UnInit();例七:容易忽視的深層次結(jié)構(gòu)對象的內(nèi)存泄漏typedef struct MyStructint i;BSTR bstr;void MyFun(OLECHAR * sz)MyStruc

8、t* pStru = new MyStruct;pStru-bstr = SysAllocString(sz);delete pStru;注意:pStru是個深層次結(jié)構(gòu)的對象,在這個對象內(nèi)部還有指針數(shù)據(jù)類型bstr,在釋放pStr時,如果忘記了釋放其內(nèi)部的指針對象bstr,也會導(dǎo)致內(nèi)存泄漏。當(dāng)然這個例子比較簡單,在我們實(shí)際編程時,深層次結(jié)構(gòu)的對象要比這個復(fù)雜的多,所以處理這些對象時需要格外小心。例八:虛基類的析構(gòu)函數(shù)可能導(dǎo)致的問題/ Base.hclass Basepublic:Base();Base();virtual void TestFun();/ Base.cppBase:Base()

9、Base:Base()if (m_pStr != NULL)delete m_pStr;void Base:TestFun()/ MyClass.hclass MyClass : public Basepublic:MyClass();MyClass();virtual void TestFun();protected:char* m_pStr;/ MyClass.cppMyClass:MyClass(): m_pStr(NULL)MyClass:MyClass()if (m_pStr != NULL)delete m_pStr;void MyClass:TestFun()m_pStr = n

10、ew char100;/ Test.cppint _tmain(int argc, _TCHAR* argv)Base* pClass = new CMyClass();pClass-TestFun();delete pClass;return 0;注意:由于Base類的析構(gòu)函數(shù)不是virtual類型,在_tmain程序的用法中,將會導(dǎo)致CMyClass的析構(gòu)不會被調(diào)用,引起內(nèi)存泄漏??偨Y(jié):1、 C+編程中,內(nèi)存泄漏是個比較煩人的問題,創(chuàng)建(new)對象的“入口”一般只有一處,但需要釋放(delete)對象的“出口”卻很多,而且由于創(chuàng)建(new)出來的對象的生存周期不固定,所以要完全避免內(nèi)存泄漏是比較困難,需要我們在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論