国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++堆內(nèi)存空間詳解(釋放內(nèi)存、內(nèi)存泄露)

2020-05-23 14:27:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
家里要來(lái)客人了,我們要給客人們泡茶。如果規(guī)定只能在確定來(lái)幾位客人之前就把茶泡好,這就會(huì)顯得很尷尬:茶泡多了會(huì)造成浪費(fèi),泡少了怕怠慢了客人。所以,最好的方法就是等知道了來(lái)幾位客人再泡茶,來(lái)幾位客人就泡幾杯茶。

然而,我們?cè)谑褂脭?shù)組的時(shí)候也會(huì)面臨這種尷尬:數(shù)組的存儲(chǔ)空間必須在程序運(yùn)行前申請(qǐng),即數(shù)組的大小在編譯前必須是已知的常量表達(dá)式。空間申請(qǐng)得太大會(huì)造成浪費(fèi),空間申請(qǐng)得太小會(huì)造成數(shù)據(jù)溢出而使得程序異常。所以,為了解決這個(gè)問(wèn)題,我們需要能夠在程序運(yùn)行時(shí)根據(jù)實(shí)際情況申請(qǐng)內(nèi)存空間。

在C++中,允許我們?cè)诔绦蜻\(yùn)行時(shí)根據(jù)自己的需要申請(qǐng)一定的內(nèi)存空間,我們把它稱(chēng)為堆內(nèi)存(Heap)空間

如何獲得堆內(nèi)存空間

我們用操作符new來(lái)申請(qǐng)堆內(nèi)存空間,其語(yǔ)法格式為:
    new 數(shù)據(jù)類(lèi)型[表達(dá)式];
其中,表達(dá)式可以是一個(gè)整型正常量,也可以是一個(gè)有確定值的整型正變量,其作用類(lèi)似聲明數(shù)組時(shí)的元素個(gè)數(shù),所以?xún)膳缘闹欣ㄌ?hào)不可省略。如果我們只申請(qǐng)一個(gè)變量的空間,則該表達(dá)式可以被省略,即寫(xiě)作:
    new 數(shù)據(jù)類(lèi)型;

使用new操作符后,會(huì)返回一個(gè)對(duì)應(yīng)數(shù)據(jù)類(lèi)型的指針,該指針指向了空間的首元素。所以,我們?cè)谑褂胣ew操作符之前需要聲明一個(gè)對(duì)應(yīng)類(lèi)型的指針,來(lái)接受它的返回值。如下面程序段:
int *iptr;//聲明一個(gè)指針
int size;//聲明整型變量,用于輸入申請(qǐng)空間的大小
cin >>size;//輸入一個(gè)正整數(shù)
iptr=new int[size];//申請(qǐng)堆內(nèi)存空間,接受new的返回值

我們又知道,數(shù)組名和指向數(shù)組首元素的指針是等價(jià)的。所以,對(duì)于iptr我們可以認(rèn)為是一個(gè)整型數(shù)組。于是,我們實(shí)現(xiàn)了在程序運(yùn)行時(shí),根據(jù)實(shí)際情況來(lái)申請(qǐng)內(nèi)存空間。

釋放內(nèi)存

當(dāng)一個(gè)程序運(yùn)行完畢之后,它所使用的數(shù)據(jù)就不再需要。由于內(nèi)存是有限的,所以它原來(lái)占據(jù)的內(nèi)存空間也應(yīng)該釋放給別的程序使用。對(duì)于普通變量和數(shù)組,在程序結(jié)束運(yùn)行以后,系統(tǒng)會(huì)自動(dòng)將它們的空間回收。然而對(duì)于我們自己分配的堆內(nèi)存空間,大多數(shù)系統(tǒng)都不會(huì)將它們回收。如果我們不人為地對(duì)它們進(jìn)行回收,只“借”不“還”,那么系統(tǒng)資源就會(huì)枯竭,電腦的運(yùn)行速度就會(huì)越來(lái)越慢,直至整個(gè)系統(tǒng)崩潰。我們把這種只申請(qǐng)空間不釋放空間的情況稱(chēng)為內(nèi)存泄露(Memory Leak)

確認(rèn)申請(qǐng)的堆內(nèi)存空間不再使用后,我們用delete操作符來(lái)釋放堆內(nèi)存空間,其語(yǔ)法格式為:
    delete [] 指向堆內(nèi)存首元素的指針;
如果申請(qǐng)的是一個(gè)堆內(nèi)存變量,則delete后的[]可以省略;如果申請(qǐng)的是一個(gè)堆內(nèi)存數(shù)組,則該[]不能省略,否則還是會(huì)出現(xiàn)內(nèi)存泄露。另外,我們也不難發(fā)現(xiàn),delete后的指針就是通過(guò)new獲得的指針,如果該指針的數(shù)據(jù)被修改或丟失,也可能造成內(nèi)存泄露。

下面我們來(lái)看一段程序,實(shí)踐堆內(nèi)存的申請(qǐng)和回收:(程序8.7)
#include "iostream.h"
int main()
{
   int size;
   float sum=0;
   int *heapArray;
   cout <<"請(qǐng)輸入元素個(gè)數(shù):";
   cin >>size;
   heapArray=new int[size];
   cout <<"請(qǐng)輸入各元素:" <<endl;
   for (int i=0;i<size;i++)
   {
      cin >>heapArray[i];
      sum=sum+heapArray[i];
   }
   cout <<"這些數(shù)的平均值為" <<sum/size <<endl;
   delete [] heapArray;
   return 0;
}

運(yùn)行結(jié)果:
請(qǐng)輸入元素個(gè)數(shù):5
請(qǐng)輸入各元素:
1 3 4 6 8
這些數(shù)的平均值為4.4
可見(jiàn),申請(qǐng)的堆內(nèi)存數(shù)組在使用上和一般的數(shù)組并無(wú)差異。我們需要記住的是,申請(qǐng)了資源用完了就一定要釋放,這是程序員的好習(xí)慣,也是一種責(zé)任。

那么,我們能不能來(lái)申請(qǐng)一個(gè)二維的堆內(nèi)存數(shù)組呢?事實(shí)上,new 數(shù)據(jù)類(lèi)型[表達(dá)式][表達(dá)式]的寫(xiě)法是不允許的。所以,如果有需要,最簡(jiǎn)單的方法就是用一個(gè)一維數(shù)組來(lái)代替一個(gè)二維數(shù)組。這就是上一章最后一小段文字的意義所在。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武邑县| 鹿邑县| 镇宁| 萨嘎县| 马山县| 佳木斯市| 府谷县| 博客| 屏边| 龙口市| 长泰县| 乌鲁木齐市| 肇庆市| 彩票| 三门峡市| 诸暨市| 尉氏县| 巴塘县| 淳安县| 辽宁省| 铁岭县| 桐城市| 宝清县| 浑源县| 深州市| 安阳市| 互助| 汨罗市| 双峰县| 云霄县| 崇明县| 马关县| 巴青县| 华亭县| 新余市| 天门市| 岐山县| 乌兰察布市| 正宁县| 上高县| 乌拉特前旗|