C++ new/delete相關(guān)知識(shí)點(diǎn)詳細(xì)解析
每個(gè)程序在執(zhí)行時(shí)都占用一塊可用的內(nèi)存空間,用于存放動(dòng)態(tài)分配的對(duì)象,此內(nèi)存空間稱為程序的自由存儲(chǔ)區(qū)(free store)或堆(heap)。C語(yǔ)言用一堆標(biāo)準(zhǔn)庫(kù)函數(shù)malloc和free在自由存儲(chǔ)區(qū)中分配存儲(chǔ)空間,而C++則用new和delete表達(dá)式實(shí)現(xiàn)相同的功能。
一、new和delete創(chuàng)建和釋放動(dòng)態(tài)數(shù)組:
數(shù)組類型的變量有三個(gè)重要的限制:數(shù)組長(zhǎng)度固定,在編譯時(shí)必須知道其長(zhǎng)度,數(shù)組只在定義它的語(yǔ)句內(nèi)存在。動(dòng)態(tài)數(shù)組:長(zhǎng)度固定,編譯時(shí)不必知道其長(zhǎng)度,通常是運(yùn)行時(shí)確定;一直存在,直到程序顯示釋放它。
1、動(dòng)態(tài)數(shù)組的定義:數(shù)組變量通過指定類型、數(shù)據(jù)名和維數(shù)來(lái)定義。而動(dòng)態(tài)分配數(shù)組時(shí),只需指定類型和數(shù)組長(zhǎng)度,不必為數(shù)組對(duì)象命名,new表達(dá)式返回指向新分配數(shù)組的第一個(gè)元素的指針:int*pia=new int[10];在自由存儲(chǔ)區(qū)中創(chuàng)建的數(shù)組對(duì)象沒有名字,只能通過其地址間接訪問堆中的對(duì)象。
2、初始化動(dòng)態(tài)分配的數(shù)組:若數(shù)組元素具有類類型,將使用該類的默認(rèn)構(gòu)造函數(shù)初始化;若數(shù)組元素是內(nèi)置類型,則無(wú)初始化。也可跟在數(shù)組長(zhǎng)度后面的一堆空?qǐng)A括號(hào),對(duì)數(shù)組元素做值初始化。
string *psa=newstring[10]; //array of 10 empty strings
int *pia=newint[10]; //array of 10 uninitializedints
int *pia2=newint[10](); //array of 10 zero
對(duì)于動(dòng)態(tài)分配的數(shù)組,其元素只能初始化為元素類型的默認(rèn)值,而不能像數(shù)組變量一樣,用初始化列表為數(shù)組元素提供各不相同的初值。
3、const對(duì)象的動(dòng)態(tài)數(shù)組:若在堆中創(chuàng)建的數(shù)組存儲(chǔ)了內(nèi)置類型的const對(duì)象,則必須為這個(gè)數(shù)組提供初始化:因數(shù)組元素都是const對(duì)象,無(wú)法復(fù)制。
const int*pci_ok=new const int[100]();
C++允許定義類類型的const數(shù)組,但該類型必須提供默認(rèn)構(gòu)造函數(shù)。
已創(chuàng)建的常量元素不允許修改,所以此類數(shù)組用處不大。
4、允許動(dòng)態(tài)分配空數(shù)組:動(dòng)態(tài)分配數(shù)組,多是由于編譯時(shí)不知道數(shù)組長(zhǎng)度。
size_t n=get_size(); int*p=new int[n];
C++雖然不允許定義長(zhǎng)度為0的數(shù)組變量,但明確指出,調(diào)用new創(chuàng)建長(zhǎng)度為0的數(shù)組是合法的。new返回有效的非零指針。該指針不能與new返回的其他指針不同,不能進(jìn)行解引用操作,因它沒指向任何元素。允許的操作:比較運(yùn)算。
5、動(dòng)態(tài)空間的釋放:程序員必須顯示將其占用的存儲(chǔ)空間返還給程序的自由存儲(chǔ)區(qū)。C++語(yǔ)言為指針提供delete []表達(dá)式釋放指針?biāo)赶虻臄?shù)組空間。
delete [] pia;[]告訴編譯器該指針指向的是堆中的數(shù)組,而非單個(gè)對(duì)象,若遺漏,編譯器無(wú)法發(fā)現(xiàn)。
二、new和delete創(chuàng)建和釋放單個(gè)對(duì)象
定義變量時(shí),必須指定其數(shù)據(jù)類型和名字。而動(dòng)態(tài)創(chuàng)建對(duì)象時(shí),只需指定其數(shù)據(jù)類型。new返回指向新創(chuàng)建對(duì)象的指針,通過該指針來(lái)訪問此對(duì)象。
1、動(dòng)態(tài)創(chuàng)建對(duì)象的初始化:int *pi=new int(1024)
2、動(dòng)態(tài)創(chuàng)建對(duì)象的默認(rèn)初始化:若不提供顯式初始化,與函數(shù)內(nèi)定義的變量初始化方式相同,類類型->默認(rèn)構(gòu)造函數(shù);內(nèi)置類型->無(wú)初始化。同樣可做值初始化:
int *pi=newint();值初始化的()必須置于類型名后,而非變量后,int x()是聲明函數(shù)。
3、撤銷動(dòng)態(tài)創(chuàng)建的對(duì)象:程序員必須顯示將該對(duì)象占用的內(nèi)存返回給自由存儲(chǔ)區(qū)。delete,若指針指向不是用new分配的內(nèi)存地址,則對(duì)該指針使用delete非法。
int i; int *pi=&i; delete pi;//編譯器不能斷定一個(gè)指針指向什么類型的對(duì)象,因此大部分編譯器仍能通過(VS2005編譯通過,執(zhí)行到該處報(bào)錯(cuò))。
4、零指針的刪除:int *ip=0; delete ip;若指針值為0,則delete合法。
5、delete后,重設(shè)指針值:delete p;刪除指針后,p成為懸垂指針。懸垂指針指向曾經(jīng)存放對(duì)象的內(nèi)存,但該對(duì)象已不存在,引用該內(nèi)存報(bào)錯(cuò)。所以一旦刪除指針?biāo)赶虻膶?duì)象,立即將指針置為0。
6、const對(duì)象的動(dòng)態(tài)分配和回收:創(chuàng)建時(shí)初始化,且一經(jīng)初始化,其值不可修改。
const int*pci=new const int(1024);new表達(dá)式返回int型const對(duì)象的指針。所以只能賦給指向const的指針。內(nèi)置類型對(duì)象或未提供默認(rèn)構(gòu)造函數(shù)的類類型對(duì)象必須顯示初始化。
刪除const對(duì)象:delete pci;
三、與動(dòng)態(tài)內(nèi)存分配相關(guān)的三種常見程序錯(cuò)誤:
1、刪除指向動(dòng)態(tài)分配內(nèi)存的指針失敗,稱為memory leak。一般需等程序運(yùn)行一段時(shí)間,耗盡內(nèi)存時(shí),才顯露出來(lái)。
2、讀寫已刪除的對(duì)象。若刪除指針?biāo)笇?duì)象后,置指針值為0,易檢查出此類錯(cuò)誤。
3、對(duì)同一個(gè)內(nèi)存空間使用兩次delete表達(dá)式。第二次delete時(shí),自由存儲(chǔ)區(qū)可能被破壞。
上一篇:深入解析C++中的引用類型
欄 目:C語(yǔ)言
下一篇:c字符串,string對(duì)象,字符串字面值的區(qū)別詳解
本文標(biāo)題:C++ new/delete相關(guān)知識(shí)點(diǎn)詳細(xì)解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4185.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)