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