new,delete总结
一?數(shù)組和new
?
數(shù)組類型變量三個重要限制:
1?數(shù)組長度不變
2?在編譯時必須知道其長度
3?數(shù)組只在定義它的塊語句內(nèi)存在
突破數(shù)組的限制
針對2?需要在運行時動態(tài)的分配數(shù)組
針對3?動態(tài)分配的數(shù)組一直存在,直到程序顯示釋放它
?
自由存儲區(qū):又叫做堆。每一個程序在執(zhí)行時都占用一塊可用的內(nèi)存空間,用于存放動態(tài)分配的對象,此內(nèi)存空間稱為程序的自由存儲區(qū)或堆。
C語言使用一對標(biāo)準(zhǔn)庫函數(shù):malloc和free
C++則使用new和delete
?
1?動態(tài)數(shù)組的定義
int *p = new int [10]; //array of 10 uninitialized ints
返回指向數(shù)組第一語速的指針,此返回值初始化了指針?p
?
在自由存儲區(qū)中創(chuàng)建數(shù)組對象是沒有名字的,程序員只能通過其地址間接的訪問堆中對象
?
2初始化動態(tài)分配的數(shù)組
string *psa = new string [10];
注意:這里分配了對象的內(nèi)存空間后,將調(diào)用string類型的默認構(gòu)造函數(shù)一次初始化數(shù)組中的每個函數(shù)
?
int *pia2 = new int [10](); //array of 10 initialized ints
可以在數(shù)組長度分配一對空括號,對數(shù)組元素做值初始化圓括號要求編譯器對數(shù)組做值初始化。
i nt *pia2 = new int [10]();?等同于nt *pia2 = new int [10](0);
動態(tài)分配的數(shù)組全部被初始化為0
?
3 const?對象的動態(tài)數(shù)組
const int *pci_ok = new const int [100]();
const string *pci = new const string[100];
當(dāng)然,創(chuàng)建常量元素不予續(xù)修改
?
4允許動態(tài)分配空數(shù)組
原因:編譯時不知道數(shù)組的長度,編寫一下代碼:
??????size_t n = get _size();
??????int??*p = new int [n];
如果get_size?返回?0?,怎么辦?
答案是:代碼仍然正確執(zhí)行
C++雖然不允許定義長度為0的數(shù)組,但是明確指明調(diào)用new動態(tài)創(chuàng)建長度為0?的數(shù)組時合法的。
char arr[0];//error
int *p = new char [0];
?
5?動態(tài)空間的釋放
delete[]表示釋放指針?biāo)赶虻臄?shù)組空間
delete [] pia;
方括號:如果漏了空方括號對,編譯器無法發(fā)現(xiàn)錯誤
可導(dǎo)致少釋放了內(nèi)存空間,產(chǎn)生內(nèi)存泄漏,嚴(yán)重的運行錯誤等
?
二?對象和new
?
定義變量時,必須指定其數(shù)據(jù)類型和名字。而動態(tài)創(chuàng)建時,只需指定其數(shù)據(jù)類型,而不必為該對象命名。
int i ;
int *p = new int;
?
1?動態(tài)創(chuàng)建對象的初始化
int i(1024);
int *pi = new int(1024);
?
string s(10,’9’);
string *ps = new string(10, ‘9’);
?
2?動態(tài)創(chuàng)建對象的默認初始化
對于類類型的對象,用該類的默認構(gòu)造函數(shù)初始化
string *ps = new string ;
內(nèi)置類型的對象則無初始化
int *pi = new int ;
?
通常,除了對其復(fù)制之外,對未初始化的對象所關(guān)聯(lián)的值的任何使用都沒有定義的。
對動態(tài)創(chuàng)建的對象做值的初始化
?
string *ps = new string(); //initialized to empty string
int *pi = new int (); //pi points to an int value-initialized to 0;
cls *pc = new cls(); //pc points to a value-initialized of type cls
?
對于提供了默認構(gòu)造函數(shù)的類類型string,沒有必要對其對性進行值的初始化:無論程序是明確的不初始化哈市要求進行值初始化,都會自動調(diào)用其默認構(gòu)造函數(shù)初始化該對象。
?
3耗盡內(nèi)存
New失敗,系統(tǒng)將拋出名為bad_alloc的一場
?
4?撤銷動態(tài)創(chuàng)建的對象
delete pi;
?
5 0指針的刪除
int *ip = 0;
delete ip;
刪除0指針式安全
?
6?在delete之后重設(shè)指針的值
執(zhí)行語句
delete p;后,p變成沒有定義。
在很多機器上,盡管p沒有定義,蛋仍然存放了它之前所指向?qū)ο蟮牡刂?#xff0c;然而p所指向的內(nèi)存已經(jīng)已經(jīng)被釋放,因此p不再有效。
?
刪除指針后,該指針變成懸垂指針。
懸垂指針?:指向曾經(jīng)存放對象的內(nèi)存,蛋該對象已經(jīng)不再存在了。
懸垂指針往往導(dǎo)致程序的錯誤,而且很難檢測出來
?
注意:?一旦刪除了指針?biāo)赶虻膶ο?#xff0c;立即將指針置0,這樣就非常清楚的表明指針不再指向任何對象。
?
7 const?對象的動態(tài)分配和回收
const int *pci = new const int(1024);
與其他常量一樣,動態(tài)創(chuàng)建的const對象必須在創(chuàng)建時初始化,并且一經(jīng)初始化,其值就不能再修改。與其他const對象的地址一樣,由于new返回的地址上存放的是const對象,因此該地址只能付給指向const的指針。
?
const string *pcs = new const string ;
?
8?刪除const對象
盡管程序員不能夠改變const對象的值,但可撤銷對象本身。Const對象也是使用刪除指針來釋放的
delete pci;
?
程序錯誤與動態(tài)分配內(nèi)存分配:
1?刪除指向動態(tài)分配內(nèi)存的指針失敗,因而無法將該塊內(nèi)存返還給自由存儲區(qū),刪除動態(tài)分配內(nèi)存失敗稱為“內(nèi)存泄漏(memory leak)”。內(nèi)存泄漏很難發(fā)現(xiàn),等程序運行了一段時間后,耗盡內(nèi)存空間時,內(nèi)存泄漏才會顯露出來。
?
2?讀寫已刪除的對象。
如果刪除指針?biāo)赶虻膶ο笾?#xff0c;將指針置為0值,則比較容易檢測出這類錯誤。
?
3?對同一個?呢此存空間使用兩次delete表達式。
當(dāng)兩個指針指向同一個動態(tài)創(chuàng)建的對象,刪除時就會發(fā)生錯誤。如果在其中一個指針上做delete運算,將該對象的內(nèi)存空間返還給自由存儲區(qū),然后接著delete第二個指針,此時則自由存儲區(qū)可能會被破壞。
?
由C++Primer總結(jié)。
總結(jié)
以上是生活随笔為你收集整理的new,delete总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算最长公共数字串个数
- 下一篇: 对称密码获取(OJ)