C++中new與delete的用法
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-12-08 08:46:28 閱讀次數(shù):4180次
最近在學(xué)習(xí)C++的進(jìn)程中,發(fā)現(xiàn)指針和new和delete的使用遍及全書(shū),可見(jiàn)其重要性。在學(xué)習(xí)了1個(gè)階段以后,總結(jié)1下new和delete的用法,指針還沒(méi)有摸透,待往后總結(jié)。
1.new和delete有甚么用?
new和delete是C++中的兩個(gè)操作符,new用于給單個(gè)對(duì)象或數(shù)組,結(jié)構(gòu)等分配內(nèi)存,在內(nèi)存使用完后,用delete進(jìn)行釋放內(nèi)存。而且是逐一對(duì)應(yīng)關(guān)系,有了new分配了內(nèi)存,必定需要delete來(lái)釋放內(nèi)存,其分配和釋放的必須是同1地址的內(nèi)存。不然就很有可能致使內(nèi)存泄漏的后果,如果內(nèi)存泄漏嚴(yán)重,程序就極有可能崩潰。
2.使用new創(chuàng)建動(dòng)態(tài)數(shù)組
在這里順便介紹3個(gè)術(shù)語(yǔ):
(1)聯(lián)編(binding):聯(lián)編是指1個(gè)計(jì)算機(jī)程序本身彼此關(guān)聯(lián)(使1個(gè)源程序經(jīng)過(guò)編譯、連接,成為1個(gè)可履行程序)的進(jìn)程,在這個(gè)聯(lián)編進(jìn)程中,需要肯定程序中的操作調(diào)用(函數(shù)調(diào)用)與履行該操作(函數(shù))的代碼段之間的映照關(guān)系,依照聯(lián)編所進(jìn)行的階段不同,可分為靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編。
(2)靜態(tài)聯(lián)編(static binding):是指在編譯階段就將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián)起來(lái),因此靜態(tài)聯(lián)編也叫早綁定,在編譯階段就必須了解所有的函數(shù)或模塊履行所需要檢測(cè)的信息,它對(duì)函數(shù)的選擇是基于指向?qū)ο蟮闹羔槪ɑ蛟茫┑念愋汀?/span>
(3)動(dòng)態(tài)聯(lián)編(dynamic binding):指在程序履行的時(shí)候才將函數(shù)實(shí)現(xiàn)和函數(shù)調(diào)用關(guān)聯(lián),因此也叫運(yùn)行時(shí)綁定或晚綁定,動(dòng)態(tài)聯(lián)編對(duì)函數(shù)的選擇不是基于指針或援用,而是基于對(duì)象類型,不同的對(duì)象類型將做出不同的編譯結(jié)果。
然后我們假定需要編寫1個(gè)程序,其中需要的數(shù)組長(zhǎng)度沒(méi)法在編譯時(shí)進(jìn)行肯定,而需要在運(yùn)行時(shí)期肯定其中的值,這樣就沒(méi)法通過(guò)聲明1個(gè)數(shù)組滿足需求了。由于聲明數(shù)組后,程序在編譯期間將會(huì)為它分配內(nèi)存,不管程序終究是不是使用過(guò)數(shù)組,這個(gè)數(shù)組都占用了1定的內(nèi)存,而且它不夠靈活。所以在這類情況下,我們就需要使用動(dòng)態(tài)聯(lián)編。也是用使用new創(chuàng)建動(dòng)態(tài)數(shù)組,在運(yùn)行時(shí)分配內(nèi)存。
代碼實(shí)例:
#include <iostream>
int main()
{
using namespace std;
int * point = new int[3];
//int * point[3] = new int;
//This is a wrong way to difine a array
point[0] = 1;
point[1] = 2;
point[2] = 3;
cout << "point[0] is " << point[0] << "
";
cout << "point[1] is " << point[1] << "
";
cout << "point[2] is " << point[2] << endl; //endl is equal to "
"
delete [] point; //free memory
return 0;
}
這段代碼簡(jiǎn)單易懂,但凡是有點(diǎn)編程基礎(chǔ)的人應(yīng)當(dāng)都能看懂。其中最關(guān)鍵的兩句不過(guò)就是new分配內(nèi)存和delete釋放內(nèi)存的語(yǔ)句。new表達(dá)式分配了1個(gè)含有3個(gè)元素的數(shù)組,并且指針指向數(shù)組第1個(gè)元素,數(shù)組名此時(shí)表示數(shù)組第1個(gè)元素的地址。
3.使用new創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)
創(chuàng)建動(dòng)態(tài)結(jié)構(gòu)和創(chuàng)建動(dòng)態(tài)數(shù)組的方式和思想并沒(méi)有太大的出入。直接上實(shí)例,在代碼中分析。
struct struct1 //structure definition
{
char name[20];
float volume;
double price;
};
int main()
{
using namespace std;
struct1 * ps = new struct1; //allot memory for structure
cout << "Enter name of struct1 item: ";
cin.get(ps->name,20);
cout << "Enter volume in cubic feet: ";
cin >> (*ps).volume; //method 2 for memory
access
cout << "Enter price: $";
cin >> ps -> price;
cout << "Name: " << (*ps).name << endl;
cout << "Volume: " << ps->volume << " cubic feet
"; //method 1
cout << "Price: $" << ps->price << endl; //method 2
delete ps;
return 0;
}
簡(jiǎn)單說(shuō)幾點(diǎn)和創(chuàng)建動(dòng)態(tài)數(shù)組的不同的地方:
<1>創(chuàng)建數(shù)組時(shí)的指針類型可以根據(jù)需求不同可以是int,char,double等等,創(chuàng)建結(jié)構(gòu)時(shí)指針類型就只能是結(jié)構(gòu)變量了,也就是上述代碼中的struct1,不能任意的喜歡那個(gè)類型就上哪一個(gè)了。指針?lè)矫娴牟煌筒环治隽?/strong>
<2>對(duì)創(chuàng)建數(shù)組,分配內(nèi)存和釋放內(nèi)存時(shí)都有1個(gè)[],但是在結(jié)構(gòu)中,就沒(méi)有這個(gè)[]了。
4.使用new創(chuàng)建單個(gè)對(duì)象
動(dòng)態(tài)創(chuàng)建對(duì)象時(shí),只需指定其數(shù)據(jù)類型,沒(méi)必要為該對(duì)象命名,new表達(dá)式返回指向新創(chuàng)建對(duì)象的指針,我們通過(guò)該指針來(lái)訪問(wèn)此對(duì)象。
int main()
{
using namespace std;
int nights = 1001;
int * pt = new int; //allocate space for an int
*pt = 1001; //store a value there
cout << "nights value = ";
cout << nights << ": location " << &nights << endl;
cout << "int ";
cout << "value = " << *pt << ": location = " << pt << endl;
double * pd = new double; //allocate space for a double
*pd = 10000001.0; //store a value there
cout << "double ";
cout << "value = " << *pd << ": location = " << pd << endl;
cout << "location of pointer pd: " << &pd << endl;
cout << ": size of * pt = " << sizeof(*pt) << endl;
cout << "size of pd = " << sizeof pd;
cout << ": size of *pd = " << sizeof(*pd) << endl;
return 0;
}
最后簡(jiǎn)單提1下這段代碼中的nights變量和pd指針的值都寄存在棧(stack)中,而用new分配的內(nèi)存在堆(heap)或自由存儲(chǔ)區(qū)(free store)中。
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)