通常定義變量(或?qū)ο?#xff09;,編譯器在編譯時(shí)可以根據(jù)該變量(或?qū)ο?#xff09;的類型知道所需內(nèi)存空間的大小,從而系統(tǒng)在適當(dāng)?shù)臅r(shí)候事先為他們分配確定的存儲(chǔ)空間。這種內(nèi)存分配稱為靜態(tài)存儲(chǔ)分配;
這種內(nèi)存分配的方法存在比較嚴(yán)重的缺陷。
在使用數(shù)組的時(shí)候(線性擬合),總有一個(gè)問(wèn)題困擾著我們:數(shù)組應(yīng)該有多大?在很多的情況下,你并不能事先確定數(shù)組的大小。
C/C++定義了4個(gè)內(nèi)存區(qū)間:代碼區(qū),全局變量與靜態(tài)變量區(qū),局部變量區(qū)即棧區(qū)(stack),動(dòng)態(tài)存儲(chǔ)區(qū),(堆heap區(qū)或自由存儲(chǔ)區(qū)free store)。
動(dòng)態(tài)內(nèi)存分配技術(shù)可以保證 程序在運(yùn)行過(guò)程中,按照實(shí)際需要申請(qǐng)適量的內(nèi)存,使用結(jié)束后還可以釋放;
這種在程序運(yùn)行過(guò)程中申請(qǐng)和釋放的的存儲(chǔ)單元也稱為堆對(duì)象,申請(qǐng)和釋放的過(guò)程一般稱為建立(New)和刪除(delete)。
所有動(dòng)態(tài)存儲(chǔ)分配都在堆區(qū)中進(jìn)行。
功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。
結(jié)果
**功能:**釋放指針p所指向的內(nèi)存。
p必須是new操作的返回值。
int *point;
point=new int(2);
C++比C中多了類的概念,
建立對(duì)象時(shí),要調(diào)用類的構(gòu)造函數(shù);
刪除對(duì)象時(shí),要調(diào)用類的析構(gòu)函數(shù)。
內(nèi)存泄露問(wèn)題
用new分配的內(nèi)存,必須要用delete釋放!
否則,會(huì)導(dǎo)致分配的內(nèi)存無(wú)法收回,使得程序占據(jù)的內(nèi)存越來(lái)越大。
用new分配的內(nèi)存,能且僅能用一次delete釋放
下例中delete p; 是錯(cuò)誤的 ,要用delete []p才行
int * p = new int[88];
delete p; //這里就內(nèi)存泄露了,要用delete []p才行
int function(int num)
{
int *p = new[44];
if( num > 111)
return 0;
delete []p;
return 1;
}
分配:new 類型名T [數(shù)組長(zhǎng)度 ]
數(shù)組長(zhǎng)度可以是任何表達(dá)式,在運(yùn)行時(shí)計(jì)算
釋放:delete [] 數(shù)組名p
釋放指針p所指向的數(shù)組。
p必須是用new分配得到的數(shù)組首地址。
new 類型名T[第1維長(zhǎng)度][第2維長(zhǎng)度]…;
如果內(nèi)存申請(qǐng)成功,new運(yùn)算返回一個(gè)指向新分配內(nèi)存首地址的指針,是一個(gè)T類型的數(shù)組,數(shù)組元素的個(gè)數(shù)為除最左邊一維外各維下標(biāo)表達(dá)式的乘積。
錯(cuò)誤示例:
例如:動(dòng)態(tài)創(chuàng)建一個(gè)2行3列的動(dòng)態(tài)數(shù)組:
char *fp;
fp = new char[2][3];
正確實(shí)例:
char (*fp)[3];
fp = new char[2][3];
動(dòng)態(tài)生成二維數(shù)組還可以這樣子
int **a = new int*[n];
for(int i = 0; i < n; i++)
a[i] = new int[m];
聯(lián)系客服