版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,對(duì)于計(jì)算機(jī)程序設(shè)計(jì)而言,變量和對(duì)象在內(nèi)存中的分配都是編譯器在編譯程序時(shí)安排好的,這帶來(lái)了極大的不便,如數(shù)組必須大開小用,指針必須指向一個(gè)已經(jīng)存在的變量或?qū)ο蟆?對(duì)于不能確定需要占用多少內(nèi)存的情況,動(dòng)態(tài)內(nèi)存分配解決了這個(gè)問題。 C/C+定義了4個(gè)內(nèi)存區(qū)間:代碼區(qū),全局?jǐn)?shù)據(jù)區(qū),棧區(qū),堆(heap)區(qū)。,2,通常定義變量時(shí),編譯器在編譯時(shí)根據(jù)該變量的類型,在適當(dāng)?shù)臅r(shí)候?yàn)樗麄兎峙渌璧膬?nèi)存空間大小。這種內(nèi)存分配稱為靜態(tài)存儲(chǔ)分配。 但有些操作只有在程序運(yùn)行時(shí)才能確定,這樣編譯器在編譯時(shí)就無(wú)法為他們預(yù)定存儲(chǔ)空間,只能在程序運(yùn)行時(shí),系統(tǒng)根據(jù)運(yùn)行時(shí)的要求進(jìn)行內(nèi)存分配,這種方法稱為動(dòng)態(tài)存儲(chǔ)分配。所有動(dòng)態(tài)存儲(chǔ)
2、分配都在堆區(qū)中進(jìn)行。,3,全局變量 靜態(tài)數(shù)據(jù) 常量,函數(shù),函數(shù)運(yùn)行 時(shí)分配的 局部變量、 函數(shù)參數(shù)、 返回?cái)?shù)據(jù)、 返回地址 等,內(nèi)存中剩余的 空間由程序員 負(fù)責(zé)申請(qǐng)和釋 放在C+里堆 空間的申請(qǐng)和 釋放分別用到 操作符:new 和 delete,全局?jǐn)?shù)據(jù)區(qū) data area,代碼區(qū) code area,棧區(qū) stack area,堆區(qū) heap area,4,當(dāng)程序運(yùn)行到需要一個(gè)動(dòng)態(tài)分配的變量或?qū)ο髸r(shí),必須向系統(tǒng)申請(qǐng)取得堆區(qū)中的一塊所需大小的存儲(chǔ)空間,用于存儲(chǔ)該變量或?qū)ο蟆?當(dāng)不再使用該變量或?qū)ο髸r(shí),也就是它的生命結(jié)束時(shí),要顯式釋放它所占用的存儲(chǔ)空間,這樣系統(tǒng)就能對(duì)該堆空間進(jìn)行再次分配,做到
3、重復(fù)使用有限的資源。,在C+中,申請(qǐng)和釋放堆中分配的存儲(chǔ)空間,分別使用new和delete這兩個(gè)運(yùn)算符來(lái)完成,其使用的格式如下: 指針變量名=new 類型名(初始值); delete 指針名; new運(yùn)算符返回的是一個(gè)指向所分配類型變量(對(duì)象)的指針。對(duì)所創(chuàng)建的變量或?qū)ο螅际峭ㄟ^(guò)該指針來(lái)間接操作的,而動(dòng)態(tài)創(chuàng)建的對(duì)象本身沒有標(biāo)識(shí)符名。,6,一般定義變量和對(duì)象時(shí)要用標(biāo)識(shí)符命名,稱命名對(duì)象,而動(dòng)態(tài)的稱無(wú)名對(duì)象。 new表達(dá)式的操作序列如下:從堆區(qū)分配對(duì)象,然后用括號(hào)中的值初始化該對(duì)象。從堆區(qū)分配對(duì)象時(shí),new表達(dá)式調(diào)用庫(kù)操作符new()。例如: int *pi=new int(0); 說(shuō)明:pi現(xiàn)
4、在所指向的變量是由庫(kù)操作符new()分配的,位于程序的堆區(qū)中,并且該對(duì)象未命名。,堆,i,下面看演示: 用初始化式(initializer)來(lái)顯式初始化 int *pi=new int(0); 當(dāng)pi生命周期結(jié)束時(shí), 必須釋放pi所指向的目標(biāo): delete pi; 注意這時(shí)釋放了pi所指的目標(biāo)的內(nèi)存空間,也就是撤銷了該目標(biāo),稱動(dòng)態(tài)內(nèi)存釋放(dynamic memory deallocation),但指針pi本身并沒有撤銷,它自己仍然存在,該指針?biāo)純?nèi)存空間并未釋放。,使用new運(yùn)算符時(shí)必須已知數(shù)據(jù)類型,new運(yùn)算符會(huì)向系統(tǒng)堆區(qū)申請(qǐng)足夠的存儲(chǔ)空間,如果申請(qǐng)成功,就返回該內(nèi)存塊的首地址,如果申請(qǐng)
5、不成功,則返回零值。 一般格式 格式1:指針變量名=new 類型標(biāo)識(shí)符; 格式2:指針變量名=new 類型標(biāo)識(shí)符(初始值); 格式3:指針變量名=new 類型標(biāo)識(shí)符內(nèi)存單元個(gè)數(shù); 說(shuō)明:格式1和格式2都是申請(qǐng)分配某一數(shù)據(jù)類型所占字節(jié)數(shù)的內(nèi)存空間;但是格式2在內(nèi)存分配成功后,同時(shí)將一初值存放到該內(nèi)存單元中;而格式3可同時(shí)分配若干個(gè)內(nèi)存單元,相當(dāng)于形成一個(gè)動(dòng)態(tài)數(shù)組。,9,【例91:利用new對(duì)變量進(jìn)行分配空間】 #include using namespace std; void main() char *pc; int *pi; pc=new char; pi=new int(8); *pc=a
6、; coutpcendl; cout*piendl; ,/格式1,/格式2,輸出結(jié)果: a 8,a,堆區(qū),8,pc,pi,棧區(qū),1000,1001,如果內(nèi)存分配失敗,則返回零值。所以在動(dòng)態(tài)分配內(nèi)存時(shí),應(yīng)對(duì)返回的指針進(jìn)行檢查,10,對(duì)于數(shù)組進(jìn)行動(dòng)態(tài)分配的格式為: 指針變量名=new 類型名下標(biāo)表達(dá)式; delete 指向該數(shù)組的指針變量名; 兩式中的方括號(hào)是非常重要的,兩者必須配對(duì)使用,如果delete語(yǔ)句中少了方括號(hào),因編譯器認(rèn)為該指針是指向數(shù)組第一個(gè)元素的指針,會(huì)產(chǎn)生回收不徹底的問題(只回收了第一個(gè)元素所占空間),加了方括號(hào)后就轉(zhuǎn)化為指向數(shù)組的指針,回收整個(gè)數(shù)組。 delete 的方括號(hào)中不
7、需要填數(shù)組元素?cái)?shù),系統(tǒng)自知。即使寫了,編譯器也忽略。 請(qǐng)注意“下標(biāo)表達(dá)式”不是常量表達(dá)式,即它的值不必在編譯時(shí)確定,可以在運(yùn)行時(shí)確定。,【例92:new 運(yùn)算符為數(shù)組分配空間】 void main() char * string=new char20; char str20; strcpy(string,It is a string.); strcpy(str,It is a string too.); coutstringendl; coutstrendl; 問:內(nèi)存區(qū)域中,棧區(qū)怎么變化?堆區(qū)怎么變化?,12,I,t,I,t,堆區(qū),棧區(qū),str,string,13,【例93:動(dòng)態(tài)數(shù)組的建立與
8、撤銷】 void main() int n; char *pc; coutn; /在運(yùn)行時(shí)確定,可輸入17 pc=new charn; /申請(qǐng)17個(gè)字符(可裝8個(gè)漢字和一個(gè)結(jié)束符)的內(nèi)存空間 strcpy(pc,堆內(nèi)存的動(dòng)態(tài)分配); coutpcendl; delete pc; /釋放pc所指向的n個(gè)字符的內(nèi)存空間 ,使用new運(yùn)算符分配的內(nèi)存一定要釋放,否則會(huì)產(chǎn)生系統(tǒng)內(nèi)存泄漏。如:,void main() char *pc; int *pi; pc=new char; pi=new int(8); *pc=a; coutpcendl; cout*piendl; ,15,a,8,pc,pi,棧
9、區(qū),1000,1001,當(dāng)該函數(shù)或者該程序執(zhí)行完畢后系統(tǒng)彈棧,pc和pi這兩個(gè)變量將消失,但他們指向的堆內(nèi)的內(nèi)存并不會(huì)自動(dòng)釋放,那么該內(nèi)存將再不能使用,除非系統(tǒng)重啟,堆區(qū),void main() char *pc=NULL; int *pi; pc=new char; pi=new int(8); *pc=a; coutpcendl; cout*piendl; if(pc) delete pc; if(pi) delete pi; ,17,void main() char * string=new char20; if (string=0) return; char str20; strcpy
10、(string,It is a string.); strcpy(str,It is a string too.); coutstringendl; coutstrendl; delete string; ,對(duì)于動(dòng)態(tài) 申請(qǐng)數(shù)組 空間的釋 放,18,I,t,I,t,堆區(qū),棧區(qū),str,string,回收的空間,1000,1000,19,20,【例94】從鍵盤輸入10個(gè)int型數(shù),而后按輸入的相反順序輸出它們。要求使用new運(yùn)算符動(dòng)態(tài)申請(qǐng)數(shù)據(jù)空間存放數(shù)據(jù)。程序執(zhí)行后的輸入輸出界面為: 輸入:1 2 3 4 5 6 7 8 9 10 運(yùn)行輸出:10 9 8 7 6 5 4 3 2 1,21,void
11、 main() int i, *a, *p; a = new int10; cout*(a+i); /也可用ai cout=a; p-) cout*p ; coutendl; ,以變量形式分配內(nèi)存比較死板。有了new和delete,就可以實(shí)現(xiàn)一種動(dòng)態(tài)分配內(nèi)存的形式,即通過(guò)指針引用,而內(nèi)存的分配和釋放可以在程序的任何地方進(jìn)行。,動(dòng)態(tài)分配失敗。返回一個(gè)空指針(NULL),表示發(fā)生了異常,堆資源不足,分配失敗。 指針刪除與堆空間釋放。刪除一個(gè)指針p(delete p;)實(shí)際意思是刪除了p所指的目標(biāo)(變量或?qū)ο蟮龋?,釋放了它所占的堆空間,而不是刪除本身,釋放堆空間后,成了空指針。,內(nèi)存泄漏(memory leak)和重復(fù)釋放。new與delete 是配對(duì)使用的, delete只能釋放堆空間。如果new返回的指針值丟失,則
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中職市場(chǎng)營(yíng)銷(產(chǎn)品推銷)試題及答案
- 2025年中職冶金安全(冶金安全技術(shù))試題及答案
- 2026年作家(文學(xué)創(chuàng)作)考題及答案
- 大學(xué)(藝術(shù)設(shè)計(jì)學(xué))形象設(shè)計(jì)基礎(chǔ)2026年階段測(cè)試題及答案
- 2025年大學(xué)大三(林業(yè)經(jīng)濟(jì)管理)林業(yè)產(chǎn)業(yè)運(yùn)營(yíng)實(shí)務(wù)試題及答案
- 2025年高職園藝技術(shù)(植物營(yíng)養(yǎng)與施肥)試題及答案
- 2025年高職(云計(jì)算應(yīng)用)云服務(wù)應(yīng)用開發(fā)階段測(cè)試題及答案
- 2025年大學(xué)國(guó)際經(jīng)濟(jì)與貿(mào)易(國(guó)際經(jīng)濟(jì)與貿(mào)易教育心理學(xué))試題及答案
- 2025年大學(xué)動(dòng)畫(動(dòng)畫基礎(chǔ)設(shè)計(jì))試題及答案
- 2026年??诮?jīng)濟(jì)學(xué)院?jiǎn)握芯C合素質(zhì)筆試參考題庫(kù)帶答案解析
- 2025電化學(xué)儲(chǔ)能電站施工及驗(yàn)收規(guī)范
- 2025年危險(xiǎn)性較大的分部分項(xiàng)工程安全管理規(guī)定考核試題(附答案)
- DBJT 61-42-2016 智能建筑工程施工工藝標(biāo)準(zhǔn)
- DB37∕T 4269-2020 輸變電工程施工企業(yè)安全生產(chǎn)風(fēng)險(xiǎn)分級(jí)管控和事故隱患排查治理體系實(shí)施指南
- 工地試驗(yàn)室安全知識(shí)培訓(xùn)課件
- 理解當(dāng)代中國(guó) 大學(xué)英語(yǔ)綜合教程1(拓展版)課件 B1U3 Into the green
- 口腔前牙即刻種植技術(shù)要點(diǎn)
- 泌尿系CTU增強(qiáng)掃描技術(shù)
- 公司董事長(zhǎng)生日策劃方案
- 2025春季學(xué)期國(guó)開河南電大??啤睹貢鴮?shí)務(wù)》一平臺(tái)無(wú)紙化考試(作業(yè)練習(xí)+我要考試)試題及答案
- (高清版)DG∕TJ 08-2093-2019 電動(dòng)汽車充電基礎(chǔ)設(shè)施建設(shè)技術(shù)標(biāo)準(zhǔn) 含2021年局部修訂
評(píng)論
0/150
提交評(píng)論