日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

new,delete总结

發布時間:2025/5/22 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。