freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

動態(tài)內存分配ppt課件-展示頁

2025-05-15 12:07本頁面
  

【正文】 t(student amp。 if(pName=new char[strlen(pname)+1]) strcpy(pName,pname)。cout缺省 endl。 缺省構造函數(shù): student::student(){ coutConstructor。s)。 student amp。s)。 student(char *pname)。 學生類定義: class student{ char *pName。 這時 先拷貝對象主體,再為 obj2分配一個堆對象,最后用 obj1的堆對象拷貝 obj2的堆對象 ?!闭Z句,則如果先析構函數(shù) obj1時,堆對象已經釋放,以后再析構 obj2時出現(xiàn)了二次釋放的問題。當析構時,如用缺省的析構函數(shù),則動態(tài)分配的堆對象不能回收。 這稱為 淺拷貝。 如果沒有缺省的構造函數(shù) , 則不能創(chuàng)建對象數(shù)組 。 delete []pc2。 //動態(tài)建立數(shù)組 , 不能初始化 , 調用 n次缺省構造函數(shù) …… delete pc。 cinn。 //調用三參數(shù)構造函數(shù) pc1=new CGoods()。 CGoods *pc,*pc1,*pc2。 Total_value=price*amount。 Amount=amount。 //因已有構造函數(shù) , 系統(tǒng)不會自動生成 , 必須顯式說明 。 public: CGoods(){}。 float Price。見下例類說明: 堆對象與構造函數(shù) class CGoods{ char Name[21]。這些參數(shù)即構造函數(shù)的參數(shù)。 //先析構 ,然后將內存空間返回給堆; 堆對象的生命期并不依賴于建立它的作用域,所以除非程序結束,堆對象(無名對象)的生命期不會到期,并且需要顯式地用 delete語句析構堆對象,上面的堆對象在執(zhí)行 delete語句時, C++自動調用其析構函數(shù)。 pc=new CGoods。 堆對象與構造函數(shù) 通過 new建立的對象要調用構造函數(shù),通過 deletee刪除對象也要調用析構函數(shù)。 我們也稱堆空間為自由空間( free store)就是這個原因。 4.動態(tài)分配的變量或對象的生命期。 new與 delete 是配對使用的, delete只能釋放堆空間。) 實際意思是刪除了 p所指的目標(變量或對象等),釋放了它所占的堆空間,而不是刪除p本身,釋放堆空間后,p成了 空懸指針 。 2.指針刪除與堆空間釋放。 指針使用的幾個問題: 1.動態(tài)分配失敗。 //注意撤銷次序,先列后行,與設置相反 delete[] data。im。 return。//初始化數(shù)組元素 display(data)。jn。im。exit(1)。j++){ data[j] = new double[n]。} for(int j=0。 //設置行 if ((data ) == 0){ cout Couuld not allocate. Bye ...。 //列數(shù) 先看二維數(shù)組的動態(tài)創(chuàng)建: void main(){ double **data。 const int m=4。 //刪除(釋放)二維數(shù)組; 堆內存的分配與釋放 【 例 】 動態(tài)創(chuàng)建和刪除一個 m*n個元素的數(shù)組。刪除這兩個動態(tài)數(shù)組可用下式: delete [] cp。 bp=new float [30] [20]。 //三級指針; float (*bp) [20]。這與數(shù)組的嵌套定義相一致。 //指向一個 30行 20列數(shù)組的指針 cp=new float [15] [30] [20]。 堆內存的分配與釋放 多維數(shù)組動態(tài)分配: new 類型名 [下標表達式 1] [下標表達式 2]……。盡管 C++不對數(shù)組作邊界檢查,但在堆空間分配時,對數(shù)組分配空間大小是紀錄在案的 。 } 堆內存的分配與釋放 動態(tài)分配數(shù)組有三個特點: 1. 變量 n在編譯時沒有確定的值,而是在運行中輸入, 按運行時所需分配堆空間 ,這一點是動態(tài)分配的優(yōu)點,可克服數(shù)組“大開小用”的弊端,在表、排序與查找中的算法,若用動態(tài)數(shù)組,通用性更佳。 delete []pc。 //申請 17個字符(可裝 8個漢字和一個結束符)的內存空間 strcpy(pc,堆內存的動態(tài)分配 )。 cinn。 char *pc。 請注意 “下標表達式”不是常量表達式 ,即它的值不必在編譯時確定, 可以在運行時確定 。 delete [ ]的方括號中 不需要 填數(shù)組元素數(shù) ,系統(tǒng)自知。 delete [ ] 指向該數(shù)組的指針變量名 。 注意這時釋放了 pi所指的目標的內存空間,也就是撤銷了該目標,稱動態(tài)內存釋放( dynamic memory deallocation),但 指針 pi本身并沒有撤銷 ,它自己仍然存在,該指針所占內存空間并未釋放。 堆內存的分配與釋放 堆 0 P i 下面看演示: 1.用初始化式 (initializer)來顯式初始化 int *pi=new int(0)。ival。 它與下列代碼序列 大體 等價: int ival=0。從堆區(qū)分配對象時, new表達式調用庫操作符new()。堆區(qū)是不會自動在分配時做初始化的(包括清零),所以必須用初始化式 (initializer)來顯式初始化。對所創(chuàng)建的變量或對象,都是通過該指針來間接操作的,而 動態(tài)創(chuàng)建的對象本身沒有名字。 在 C++中 , 申請和釋放堆中分配的存貯空間 , 分別使用new和 delete的兩個運算符來完成 , 其使用的格式如下: 指針變量名 =new 類型名 (初始化式 ); delete 指針名 。 堆內存的分配與釋放 當程序運行到需要一個動態(tài)分配的變量或對象時 , 必須向系統(tǒng) 申請取得 堆中的一塊所需大小的存貯空間 , 用于存貯該變量或對象 。這種內存分配稱為 靜態(tài)存儲分配 有些操作對象只有在程序運行時才能確定,這樣編譯器在編譯時就無法為他們預定存儲空間,只能在程序運行時,系統(tǒng)根據(jù)運行時的要求進行內存分配,這種方法稱為 動態(tài)存儲分配 。 堆內存分配 MFC對象和 Windows對象的關系 棧與隊列的基本操作及其應用 鏈表與鏈表的基本操作 第七章 動態(tài)內存分配 圖書流通管理系統(tǒng)設計 ——鏈表類應用 堆內存分配 堆對象與構造函數(shù) 淺拷貝與深拷貝 C/C++定義了 4個內存區(qū)間:代碼區(qū),全局變量與靜態(tài)變量區(qū),局部變量區(qū)即棧區(qū), 動態(tài)存儲區(qū),即堆( heap)區(qū)或自由存儲區(qū)( free store) 。模板 是標準 C++實現(xiàn)代碼復用的有力工具,特別是有關數(shù)據(jù)結構的算法。動態(tài)內存分配解決了這個問題。第七章 動態(tài)內存分配 本章首先介紹程序運行時 動態(tài)內存分配 ( dynamic memory allocation)的概念與方法。到目前為止,本教材介紹的程序設計中,變量和對象在 內存中的分配 都是編譯器在 編譯程序時安排 好了的,這帶來了極大的不便,如數(shù)組必須大開小用,指針必須指向一個已經存在的變量或對象。本章將進一步討論拷貝構造函數(shù);還要學習更多有關 數(shù)據(jù)結構的基本知識,包括 棧 , 隊 , 二叉樹 等的基本算法和應用。本章繼續(xù)使用模板介紹算法。 通常定義變量(或對象),編譯器在編譯時都可以根據(jù)該變量(或對象)的類型知道所需內存空間的大小,從而系統(tǒng)在適當?shù)臅r候為他們分配確定的存儲空間。所有動態(tài)存儲分配都在堆區(qū)中進行。 當不再使用該變量或對象時 , 也就是它的生命結束時 , 要 顯式釋放 它所占用的存貯空間 , 這樣系統(tǒng)就能對該堆空間進行再次分配 , 做到重復使用有限的資源 。 new運算符 返回 的是一個指向所分配類型變量(對象)的 指針 。 堆內存的分配與釋放 一般定義變量和對象時要用標識符命名,稱 命名對象 ,而動態(tài)的稱 無名對象 (請注意與棧區(qū)中的臨時對象的區(qū)別,兩者完全不同:生命期不同,操作方法不同,臨時變量對程序員是透明的 )。 new表達式的操作序列如下: 從堆區(qū)分配對象,然后用括號中的值初始化該對象 。例如: int *pi=new int(0)。 int *pi=amp。 只是 pi現(xiàn)在所指向的變量是由庫操作符 new()分配的,位于程序的堆區(qū)中,并且該 對象未命名 。 2 . 當 pi生命周期結束時 , 必須釋放 pi所指向的目標: delete pi。 堆內存的分配與釋放 對于數(shù)組進行動態(tài)分配的格式為: 指針變量名 =new 類型名 [下標表達式 ]。 兩式中的 方括號 是非常重要的,兩者必須配對使用,如果delete語句中少了方括號,因編譯器認為該指針是指向數(shù)組第一個元素的指針,會產生 回收不徹底 的問題( 只回收了第一個元素所占空間 ), 加了方括號后就轉化為指向數(shù)組的指針,回收整個數(shù)組 。即使寫了,編譯器也忽略。 堆內存的分配與釋放 【 例 】 動態(tài)數(shù)組的建立與撤銷 include include void main(){ int n。 cout請輸入動態(tài)數(shù)組的元素個數(shù) endl。 //在運行時確定, 可輸入 17 pc=new char[n]。 coutpcendl。//釋放 pc所指向的 n個字符的內存空間 return 。 delete []pc是將 n個字符的空間釋放,而用 delete pc則只釋放了一個字符的空間; 2. 如果有一個 char *pc1,令 pc1=p,同樣可用 delete [] pc1來釋放該空間。 3. 沒有初始化式( initializer), 不可對數(shù)組初始化 。 建立一個動態(tài)三維數(shù)組 float (*cp)[30][20] 。 //建立由 15個 30*20數(shù)組組成的數(shù)組; 注意 cp等效于三維數(shù)組名,但沒有指出其邊界,即最高維的元素數(shù)量,就像指向字符的指針即等效一個字符串 ,不要把指向字符的指針,說成指向字符串的指針。 堆內存的分配與釋放 比較: float(*cp) [30] [20]。 //二級指針; cp=new float [1] [20] [30]。 兩個數(shù)組都是由 600個浮點數(shù)組成,前者是只有一個元素的三維數(shù)組 ,每個元素為 30行 20列的二維數(shù)組,而另一個是有 30個元素的二維數(shù)組 ,每個元素為 20個元素的一維數(shù)組。 //刪除(釋放)三維數(shù)組; delete [] bp。采用 指針數(shù)組方式 來完成二維數(shù)組的動態(tài)創(chuàng)建。 //行數(shù) const int n=6。 data = new double*[m]。exit(1)。jm。 //設置列 if (data[j] == 0){ cout Couuld not allocate. Bye ...。} } for (int i=0。i++) for (int j=0。j++) data[i][j]=i*n+j。 de_allocate(data)。 } 堆內存的分配與釋放 再 看二維數(shù)組的撤銷與內存釋放: void de_allocate(double **data){ for (int i=0。i++) delete[] data[i]。 } 在 VC++平臺上演示本例 。 返回一個空指針( NULL),表示 發(fā)生了異常,堆資源不足,分配失敗。刪除一個指針 p( delete p。 堆內存的分配與釋放 3. 內存泄漏( memory leak)和重復釋放 。如果new返回的指針值丟失,則所分配的堆空間無法回收,稱內存泄漏,同一空間重復釋放也是危險的,因為 該空間可能已另分配 ,所以必須妥善保存 new返回的指針,以保證不發(fā)生內存泄漏,也必須保證不會重復釋放堆內存空間。 無名對象的生命期并不依賴于建立它的作用域,比如在函數(shù)中建立的動態(tài)對象在函數(shù)返回后仍可使用。 但必須記住釋放該對象所占堆空間,并只能釋放一次,在函數(shù)內建立,而在函數(shù)外釋放是一件很容易 失控 的事,往往會出錯。 CGoods *pc。 //分配堆空間,并構造一個無名的 CGoods對象; ……. delete pc。 正因為構造函數(shù)可以有參數(shù),所以 new后面類( class)類型也可以有參數(shù)。但對創(chuàng)建數(shù)組,則無參數(shù),并只調用缺省的構造函數(shù)。 int Amount。 float Total value。 //缺省構造函數(shù) 。 CGoo
點擊復制文檔內容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1