C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt

C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt

ID:57057006

大?。?3.00 KB

頁數(shù):21頁

時(shí)間:2020-07-30

C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt_第1頁
C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt_第2頁
C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt_第3頁
C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt_第4頁
C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt_第5頁
資源描述:

《C語言內(nèi)存管理和內(nèi)存泄漏課件.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫

1、C/C++內(nèi)存管理及內(nèi)存泄漏C語言的內(nèi)存管理靜態(tài)儲(chǔ)存區(qū)動(dòng)態(tài)儲(chǔ)存區(qū)(堆)棧區(qū)靜態(tài)儲(chǔ)存區(qū)“靜態(tài)存儲(chǔ)區(qū)”是放置全局變量,常量,靜態(tài)變量的區(qū)域,在程序編譯期間就已經(jīng)定義,在程序加載到內(nèi)存后被直接分配內(nèi)存的。不會(huì)有內(nèi)存泄漏發(fā)生。動(dòng)態(tài)儲(chǔ)存區(qū)“動(dòng)態(tài)存儲(chǔ)區(qū)”就是堆,是程序在運(yùn)行期間分配的內(nèi)存,比如用new,malloc等函數(shù)分配的內(nèi)存,需要程序自己用delete,free去釋放,也是容易出現(xiàn)內(nèi)存泄漏的類型。棧區(qū)“?!笔窃诤瘮?shù)內(nèi)的自動(dòng)變量分配的存儲(chǔ)區(qū),包括函數(shù)的參數(shù),函數(shù)的內(nèi)部非靜態(tài)變量的變量,它的分配由程序在運(yùn)行到這個(gè)函數(shù)的時(shí)候才被CPU分配,并在退出這個(gè)函數(shù)的時(shí)候被釋放

2、。(進(jìn)入函數(shù)時(shí),在堆棧分配內(nèi)存,退出函數(shù)時(shí)把堆棧彈出)C++的內(nèi)存管理全局/靜態(tài)存儲(chǔ)區(qū)常量存儲(chǔ)區(qū)堆自由存儲(chǔ)區(qū)棧全局/靜態(tài)存儲(chǔ)區(qū)全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C語言中,全局變量又分為初始化的和未初始化的,在C++里面沒有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。常量存儲(chǔ)區(qū)這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改堆就是那些由new分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè)new就要對(duì)應(yīng)一個(gè)delete。如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。自由存儲(chǔ)區(qū)就是那些由malloc等分配的

3、內(nèi)存塊,他和堆是十分相似的,不過它是用free來結(jié)束自己的生命的。棧就是那些由編譯器在需要的時(shí)候分配,在不需要的時(shí)候自動(dòng)清除的變量的存儲(chǔ)區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。C++中對(duì)象的內(nèi)存分配類中的靜態(tài)成員變量分配在靜態(tài)存儲(chǔ)區(qū),并且子類和父類的對(duì)象的靜態(tài)變量使用同一個(gè)地址。如果類有虛函數(shù),那么在對(duì)象內(nèi)存的最開始要加上一個(gè)VFTable指針,這個(gè)指針指向靜態(tài)存儲(chǔ)區(qū)中的vtable,在32位操作系統(tǒng)中這個(gè)指針占4個(gè)字節(jié)。其他的成員變量依次占用對(duì)象的內(nèi)存,父類的成員變量在前面。如果對(duì)象是全局變量,那么對(duì)象的內(nèi)存在靜態(tài)存儲(chǔ)區(qū),如果對(duì)象是函數(shù)局部變量,那么在

4、棧中分配,如果是new的對(duì)象,則在堆中分配。this指針不占存儲(chǔ)空間,只是在發(fā)生函數(shù)調(diào)用的時(shí)候,使用ECX寄存器保持當(dāng)前的this指針。C/C++動(dòng)態(tài)內(nèi)存分配C/C++中的動(dòng)態(tài)內(nèi)存分配一般用new和malloc等函數(shù)來分配。也就是在堆(或自由儲(chǔ)存區(qū))中分配。動(dòng)態(tài)內(nèi)存的分配必須由分配者自己手動(dòng)釋放分配的內(nèi)存,否則就會(huì)產(chǎn)生內(nèi)存泄漏。New的使用如果分配的不是數(shù)組(例如:struct,class等),直接調(diào)用delete釋放內(nèi)存。如果分配的是數(shù)組,那么要調(diào)用delete[]New和malloc的區(qū)別new是C++操作符,malloc是C函數(shù)。在C++中,如果ne

5、w的是一個(gè)類,那么new操作符自動(dòng)調(diào)用類的構(gòu)造函數(shù),而malloc則只分配內(nèi)存。new操作符暗含了sizeof,而malloc需要使用sizeof。Malloc需要用類型轉(zhuǎn)換,而new不用。使用sizeof的必要性使用sizeof()可以屏蔽因?yàn)椴僮飨到y(tǒng)帶來的內(nèi)存分配不同,增加程序的可移植性。使用sizeof()可以自動(dòng)計(jì)算一些不容易計(jì)算的類型大小,類如自定義的結(jié)構(gòu)等,并且在修改類的定義后,不用修改使用sizeof的代碼,增加程序的可維護(hù)性。使用new、malloc的注意點(diǎn)最好不要在循環(huán)里面,頻繁的調(diào)用new/malloc,因?yàn)檫@樣會(huì)造成動(dòng)態(tài)存儲(chǔ)區(qū)大量碎片

6、,從而影響系統(tǒng)性能。如果編寫的是長(zhǎng)期運(yùn)行的服務(wù)程序,盡量避免動(dòng)態(tài)內(nèi)存的分配,除非確定是只分配一次,否則如果編碼質(zhì)量不高,即使有微小的內(nèi)存泄漏,都會(huì)最后造成系統(tǒng)崩潰。編碼的時(shí)候記住所有動(dòng)態(tài)分配的內(nèi)存和釋放地點(diǎn),最好在同一個(gè)函數(shù)內(nèi)完成分配和釋放。小結(jié)動(dòng)態(tài)內(nèi)存分配【規(guī)則1】用malloc或new申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。【規(guī)則2】不要忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用?!疽?guī)則3】動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏?!疽?guī)則4】用free或delete釋放了內(nèi)存之后,立即將指針

7、設(shè)置為NULL,防止產(chǎn)生“野指針”。內(nèi)存泄漏的幾種情況new/malloc函數(shù)沒有調(diào)用相應(yīng)的函數(shù)釋放內(nèi)存。動(dòng)態(tài)內(nèi)存地址丟失首先釋放父塊函數(shù)內(nèi)分配內(nèi)存,在函數(shù)外要求釋放的函數(shù)。析構(gòu)函數(shù)沒有定義成虛函數(shù)。小結(jié)內(nèi)存泄漏始終要跟蹤所有內(nèi)存分配,并在任何適當(dāng)?shù)臅r(shí)候釋放它們。盡量保證在本函數(shù)分配的動(dòng)態(tài)內(nèi)存在本函數(shù)內(nèi)釋放。對(duì)指針賦值時(shí),要保證被賦值的指針沒有指向其他的動(dòng)態(tài)內(nèi)存。釋放一個(gè)結(jié)構(gòu)體時(shí),要先釋放結(jié)構(gòu)體的成員的指針。類的析構(gòu)函數(shù)定義成虛函數(shù),保證在多態(tài)的情況下也能正確的調(diào)用析構(gòu)函數(shù)。查找內(nèi)存泄漏的方法和工具程序方法在程序中加入語言支持的內(nèi)存檢查函數(shù)。例如:VC中的

8、“HeapStateReportingFunctions”,_Cr

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。