第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件

上傳人:沈*** 文檔編號:249799233 上傳時(shí)間:2024-10-31 格式:PPT 頁數(shù):33 大?。?.57MB
收藏 版權(quán)申訴 舉報(bào) 下載
第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件_第1頁
第1頁 / 共33頁
第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件_第2頁
第2頁 / 共33頁
第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件_第3頁
第3頁 / 共33頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件》由會員分享,可在線閱讀,更多相關(guān)《第七章-動態(tài)內(nèi)存分配--C++程序設(shè)計(jì)-計(jì)算機(jī)等級考試教學(xué)課件(33頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、*,計(jì)算機(jī)基礎(chǔ)教研室,*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,第七章 動態(tài)內(nèi)存分配,主講人:,XXX,電子郵件:,聯(lián)系電話:,2024/10/31,1,動態(tài)內(nèi)存分配,本章首先介紹程序運(yùn)行時(shí),動態(tài)內(nèi)存分配,(,dynamic memory allocation,)的概念與方法;再進(jìn)一步討論復(fù)制構(gòu)造函數(shù),.,7.1.1,自由存儲區(qū),內(nèi)存,的分配與釋放,7.1.2,自由存儲區(qū),對象,與構(gòu)造函數(shù),7.1.3,淺復(fù)制與深復(fù)制,2024/10/31,2,計(jì)算機(jī)基礎(chǔ)教研室,自由存儲區(qū)內(nèi)存分配,靜態(tài)存儲分配:,無論全局或局部變量,(,對象,),,編譯器在,編譯時(shí)

2、,都可以根據(jù)該變量,(,對象,),的類型知道所需內(nèi)存空間的大小,從而系統(tǒng)在適當(dāng)?shù)臅r(shí)候?yàn)樗鼈兎峙浯_定的存儲空間。尤其是數(shù)組。,動態(tài)存儲分配:,有些操作對象只有在程序,運(yùn)行時(shí),才能確定,這樣編譯器在編譯時(shí)就無法為他們預(yù)定存儲空間,只能在程序運(yùn)行時(shí),系統(tǒng)根據(jù)運(yùn)行時(shí)的要求進(jìn)行內(nèi)存分配,稱為動態(tài)存儲分配。動態(tài)分配都在,自由存儲區(qū),中進(jìn)行。,2024/10/31,3,計(jì)算機(jī)基礎(chǔ)教研室,自由存儲區(qū),內(nèi)存的分配與釋放,當(dāng)程序運(yùn)行到需要動態(tài)分配變量或?qū)ο髸r(shí),必須向系統(tǒng),申請取得自由存儲區(qū),中的一塊所需大小的存貯空間,用于存貯該變量或?qū)ο蟆.?dāng)不再使用該變量或?qū)ο髸r(shí),也就是它的生命結(jié)束時(shí),要,顯式釋放,它所占用的存

3、貯空間,這樣系統(tǒng)就能進(jìn)行再次分配,做到重復(fù)使用有限的資源。,動態(tài)分配與釋放:,2024/10/31,4,計(jì)算機(jī)基礎(chǔ)教研室,一般定義變量和對象時(shí)要用標(biāo)識符命名,稱,命名對象,,而動態(tài)的稱,無名對象,(,請注意與棧區(qū)中的臨時(shí)對象的區(qū)別,兩者完全不同:生命期不同,操作方法不同,臨時(shí)變量對程序員是透明的,),。,自由存儲區(qū),是不會自動在分配時(shí)做初始化的(包括清零),所以必須用初始化式,(initializer),來顯式初始化。,無名對象:,自由存儲區(qū),內(nèi)存的分配與釋放,2024/10/31,6,計(jì)算機(jī)基礎(chǔ)教研室,new,表達(dá)式的操作:,從自由存儲區(qū)分配對象,然后用括號中的值初始化該對象,。,分配對象時(shí)

4、,,new,表達(dá)式調(diào)用庫操作符,new,(),:,int,*pi=,new,int,(0);,pi,現(xiàn)在所指向的變量的存儲空間是由庫操作符,new,(),分配的,位于程序的自由存儲區(qū)中,并且該對象未命名。,自由存儲區(qū),內(nèi)存的分配與釋放,2024/10/31,7,計(jì)算機(jī)基礎(chǔ)教研室,自由存儲區(qū),i,演示:,用初始化式,(initializer),來顯式初始化,int,*pi=,new,int,(0);,當(dāng),pi,生命周期結(jié)束時(shí),,必須釋放,pi,所指向的目標(biāo):,delete,pi;,注意這時(shí)釋放了,pi,所指的目標(biāo)的內(nèi)存空間,也就是撤銷了該目標(biāo),稱動態(tài)內(nèi)存釋放(,dynamic memory de

5、allocation,),但,指針,pi,本身并沒有撤銷,,該指針?biāo)純?nèi)存空間并未釋放。,自由存儲區(qū),內(nèi)存的分配與釋放,2024/10/31,8,計(jì)算機(jī)基礎(chǔ)教研室,動態(tài)分配數(shù)組與,標(biāo)準(zhǔn)字符串類,:,標(biāo)準(zhǔn)字符串類,string,就是采用動態(tài)建立數(shù)組的方式解決數(shù)組溢出的問題的,例,7.1,所做的動態(tài)內(nèi)存分配與釋放,在,string,類對象中都是自動完成的,在程序中不需要也不允許再顯式地為,string,進(jìn)行動態(tài)內(nèi)存的分配與釋放。,【,例,7.1】,動態(tài)數(shù)組的建立與撤銷,自由存儲區(qū),內(nèi)存的分配與釋放,2024/10/31,10,計(jì)算機(jī)基礎(chǔ)教研室,【,例,7.1,】,動態(tài)數(shù)組的建立與撤銷,#inclu

6、de,#include,using namespace,std,;,int,main(),int,n;,char,*pc;,cout,請輸入動態(tài)數(shù)組的元素個(gè)數(shù),n;,/,在運(yùn)行時(shí)確定,可輸入,25,pc=,new char,n;,strcpy(pc,自由存儲區(qū)內(nèi)存的動態(tài)分配,);,coutpcendl;,delete,pc;,/,釋放,pc,所指向的,n,個(gè)字符的內(nèi)存空間,return,0;,2024/10/31,11,計(jì)算機(jī)基礎(chǔ)教研室,1.,動態(tài)分配失敗,。返回一個(gè)空指針(,NULL,),表示發(fā)生了異常,堆資源不足,分配失敗。,2.,指針刪除與自由存儲區(qū)空間釋放,。刪除一個(gè)指針,p,(,de

7、lete,p;,)實(shí)際意思是刪除了,p,所指的目標(biāo)(變量或?qū)ο蟮龋?,釋放了它所占的自由存儲區(qū)空間,而不是刪除本身,釋放自由存儲區(qū)空間后,成了空懸指針。空懸指針是程序錯誤的一個(gè)根源)。建議這時(shí)將置空(,NULL,)。,自由存儲區(qū),內(nèi)存的分配與釋放,指針使用的要點(diǎn):,2024/10/31,13,計(jì)算機(jī)基礎(chǔ)教研室,5,內(nèi)存泄漏(,memory leak,)和重復(fù)釋放,。,new,與,delete,是配對使用的,,delete,只能釋放,自由存儲區(qū),空間。如果,new,返回的指針值丟失,則所分配的,自由存儲區(qū),空間無法回收,稱內(nèi)存泄漏,同一空間重復(fù)釋放也是危險(xiǎn)的,因?yàn)?該空間可能已另分配,,所以必須妥

8、善保存,new,返回的指針,以保證不發(fā)生內(nèi)存泄漏,也必須保證不會重復(fù)釋放,自由存儲區(qū),內(nèi)存空間。,自由存儲區(qū),內(nèi)存的分配與釋放,指針使用的要點(diǎn):,2024/10/31,15,計(jì)算機(jī)基礎(chǔ)教研室,自由存儲區(qū),對象與構(gòu)造函數(shù),類對象動態(tài)建立與刪除過程:,通過,new,建立的對象要調(diào)用構(gòu)造函數(shù),通過,delete,刪除對象也要調(diào)用析構(gòu)函數(shù)。,CGoods*pc;,pc=new CGoods;,/,分配自由存儲區(qū)空間,并構(gòu)造一個(gè)無名的,CGoods,對象;,.,delete pc;,/,先析構(gòu),然后將內(nèi)存空間返回給自由存儲區(qū);,自由存儲區(qū),對象的生命期并不依賴于建立它的作用域,所以除非程序結(jié)束,,自由存

9、儲區(qū),對象(無名對象)的生命期不會到期,并且需要顯式地用,delete,語句析構(gòu)該類對象,上例執(zhí)行,delete,語句時(shí),,C+,自動調(diào)用商品類的析構(gòu)函數(shù)。,2024/10/31,16,計(jì)算機(jī)基礎(chǔ)教研室,類說明:,class,CGoods,string Name;,int,Amount;,float,Price;,float,Total_value;,public:,CGoods()cout,調(diào)用默認(rèn)構(gòu)造函數(shù),endl;,CGoods(string name,int,amount,float,price),cout,調(diào)用三參數(shù)構(gòu)造函數(shù),endl;,Name=name;Amount=amount

10、;,Price=price;Total_value=price*amount;,CGoods()cout,調(diào)用析構(gòu)函數(shù),endl;,;,【,例,7.3】,演示自由存儲區(qū)對象分配和釋放。,2024/10/31,18,計(jì)算機(jī)基礎(chǔ)教研室,使用:,int,main(),int,n;,CGoods*pc,*pc1,*pc2;,pc=,new,CGoods(,“,夏利,2000,”,,,10,,,118000);,/,調(diào)用三參數(shù)構(gòu)造函數(shù),pc1=,new,CGoods();,/,調(diào)用默認(rèn)構(gòu)造函數(shù),cout,輸入商品類數(shù)組元素?cái)?shù),n;,pc2=,new,CGoodsn;,/,動態(tài)建立數(shù)組,不能初始化,調(diào)用,

11、n,次默認(rèn)構(gòu)造函數(shù),delete,pc;,delete,pc1;,delete,pc2;,return,0;,2024/10/31,19,計(jì)算機(jī)基礎(chǔ)教研室,例,6-16,動態(tài)創(chuàng)建對象舉例,#include,using namespace std;,class Point,public:,Point(),X=Y=0;coutDefault Constructor called.n;,Point(int xx,int yy),X=xx;Y=yy;cout Constructor called.n;,Point()coutDestructor called.n;,int GetX()return X

12、;,int GetY()return Y;,void Move(int x,int y)X=x;Y=y;,private:,int X,Y;,;,2024/10/31,20,計(jì)算機(jī)基礎(chǔ)教研室,int main(),coutStep One:endl;,Point*Ptr1=new Point;,delete Ptr1;,coutStep Two:endl;,Ptr1=new Point(1,2);,delete Ptr1;,return 0;,運(yùn)行結(jié)果:,Step One:,Default Constructor called.,Destructor called.,Step Two:,Con

13、structor called.,Destructor called.,21,例,6-16,動態(tài)創(chuàng)建對象舉例,2024/10/31,21,計(jì)算機(jī)基礎(chǔ)教研室,淺復(fù)制(淺拷貝),實(shí)現(xiàn)對象間數(shù)據(jù)元素的一一對應(yīng)復(fù)制。,深復(fù)制(深拷貝),當(dāng)被復(fù)制的對象數(shù)據(jù)成員是指針類型時(shí),不是復(fù)制該指針成員本身,而是將指針?biāo)傅膶ο筮M(jìn)行復(fù)制。,淺復(fù)制與深復(fù)制,2024/10/31,22,計(jì)算機(jī)基礎(chǔ)教研室,當(dāng),淺復(fù)制,析構(gòu)時(shí),如用默認(rèn)的析構(gòu)函數(shù),則動態(tài)分配的,自由存儲區(qū),對象不能回收。如果在析構(gòu)函數(shù)中有“,delete p;,”,語句,則如果先析構(gòu)函數(shù),obj1,時(shí),,自由存儲區(qū),對象已經(jīng)釋放,以后再析構(gòu),obj2,時(shí)出

14、現(xiàn)了二次釋放的問題。,自由存儲區(qū),對象,P,P,自由存儲區(qū),對象,圖,7.2,深復(fù)制,深復(fù)制:,重新定義復(fù)制的構(gòu)造函數(shù),給每個(gè)對象獨(dú)立分配一個(gè),自由存儲區(qū),對象,稱,深復(fù)制,。,這時(shí)先復(fù)制對象主體,再為,obj2,分配一個(gè),自由存儲區(qū),對象,最后用,obj1,的,自由存儲區(qū),對象復(fù)制,obj2,的,自由存儲區(qū),對象。,obj1,obj2,淺復(fù)制與深復(fù)制,2024/10/31,24,計(jì)算機(jī)基礎(chǔ)教研室,淺復(fù)制與深復(fù)制,【,例,7.4】,定義復(fù)制構(gòu)造函數(shù),(,copy structor,)和復(fù)制賦值操作符(,copy Assignment Operator,)實(shí)現(xiàn)深復(fù)制。,學(xué)生類定義:,class,

15、student,char,*pName;,/,為了演示深復(fù)制,不用,string,類,public,:,student();,/,默認(rèn)構(gòu)造函數(shù),student(char*pname);,/,帶參數(shù),構(gòu)造函數(shù),student(student,/,復(fù)制構(gòu)造函數(shù),student();,/,析構(gòu)函數(shù),student&,operator,=(student,/,復(fù)制賦值操作符,檢驗(yàn),主函數(shù),和,運(yùn)行結(jié)果,2024/10/31,25,計(jì)算機(jī)基礎(chǔ)教研室,例,7.4,實(shí)現(xiàn)深復(fù)制,默認(rèn)構(gòu)造函數(shù):,student:student(),coutConstructor;,pName=NULL;,cout,默認(rèn)“,en

16、dl;,帶參數(shù),構(gòu)造函數(shù):,student:student(,char,*pname),coutConstructor;,if,(pName=,new,char,strlen(pname)+1),strcpy(pName,pname);,coutpNameendl;,2024/10/31,26,計(jì)算機(jī)基礎(chǔ)教研室,例,7.4,實(shí)現(xiàn)深復(fù)制,復(fù)制賦值操作符:,student&student:,operator,=(student&s),coutCopy Assign operator;,delete,pName,;/,如原來已分配,應(yīng)先撤銷,再重分配,if,(s.pName),/,否則會發(fā)生內(nèi)存泄漏,if,(pName=,new,char,strlen(s.pName)+1),strcpy(pName,s.pName);,else,pName=NULL;,coutpNameendl;,return,*,this,;,2024/10/31,28,計(jì)算機(jī)基礎(chǔ)教研室,例,7.4,實(shí)現(xiàn)深復(fù)制,int,main(,void,),student s1(,范英明,),s2(,沈俊,),s3;,studen

展開閱讀全文
溫馨提示:
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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  sobing.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!