




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國雙螺桿聚合反應(yīng)器數(shù)據(jù)監(jiān)測報告
- 2025年中國單頭膠絲花數(shù)據(jù)監(jiān)測報告
- 從政策角度看醫(yī)療AI技術(shù)的倫理審查問題
- 以農(nóng)業(yè)科技助力醫(yī)療事業(yè)發(fā)展-水稻為例
- 從專業(yè)角度深度分析在各類企業(yè)中如何實(shí)施和應(yīng)用區(qū)塊鏈技術(shù)
- 2025年中國書寫商標(biāo)原紙數(shù)據(jù)監(jiān)測研究報告
- 2025年中國中空玻璃裝飾隔條市場調(diào)查研究報告
- 2025年中國不銹鋼傳感器接頭數(shù)據(jù)監(jiān)測報告
- 25年公司項(xiàng)目部負(fù)責(zé)人安全培訓(xùn)考試試題附參考答案【鞏固】
- 從知情同意到被遺忘權(quán)探討現(xiàn)代醫(yī)療APP的隱私政策演變
- 2024年8月CCAA注冊審核員OHSMS職業(yè)健康安全管理體系基礎(chǔ)知識考試題目含解析
- 《工程建設(shè)標(biāo)準(zhǔn)強(qiáng)制性條文》(水利工程部分)
- 《PBR次世代游戲建模技術(shù)》(微課版)課件 0課程導(dǎo)引
- 后所村城中村改造建設(shè)項(xiàng)目節(jié)能評估報告
- 中小學(xué)班主任工作指南
- DB35∕T 2174-2024 改良酸性土壤專用有機(jī)肥料通 用技術(shù)要求
- 北師大版數(shù)學(xué)五年級下冊《確定位置》課件教學(xué)課件
- 遼寧葫蘆島協(xié)作校2025屆高三第二次聯(lián)考生物試卷含解析
- DL∕T 1396-2014 水電建設(shè)項(xiàng)目文件收集與檔案整 理規(guī)范
- 2024年紀(jì)檢監(jiān)察綜合業(yè)務(wù)知識考試題庫及參考答案(完整版)
- DL-T5181-2017水電水利工程錨噴支護(hù)施工規(guī)范
評論
0/150
提交評論