程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++ new 和 delete

c++ new 和 delete

編輯:關於C++

一. 用new和delete創建和釋放單個對象

動態創建對象時,只需要指定其數據類型, 而不必為該對象命名. new 表達式返回指向新創建對象的指針, 通過指針來訪問此對象.

 

int *pi = new int;
這個new表達式在自由存儲區中分配創建了一個整型對象, 並返回此對象的地址, 並用該地址初始化指針pi.

 

 

1.動態創建對象的初始化

動態創建的對象可用初始化變量的方式實現初始化.

 

int *pi = new int (1024) ;

string *ps = new string(10, '9');

 

2.動態創建對象的默認初始化

如果不提供顯示初始化, 對於類類型的對象, 用該類的默認構造函數初始化;而內置類型的對象則無初始化.

 

string *ps = new string() ; 
string *ps= new string ;
對於類類型, 例如上面的string類型, 兩個語句是一樣的, 都是初始化為空字符串.

 

而對於內置類型, 如

 

int *pi = new int;
int *pi = new int();
不初始化和提供顯示初始化的結果有顯著的差別.

 

第一個語句pi指向一個未初始化的int類型, 而第二個語句pi指向一個初始化為0的int類型.

 

3.耗盡內存

如果程序用完了所有可用的內存, new表達式就有可能失敗. 如果new表達式無法獲取想要的內存空間, 系統將拋出名為bad_alloc的異常.

 

4.撤銷動態創建的對象

動態創建的對象用完後, 程序員必須顯式地將該對象占用的內存返回給自由存儲區. c++提供delete表達式釋放指針所指向的地址空間.如果指針指向的不是用new分配的內存地址, 則在該指針上使用delete是不合法的.

delete pi;

 

5.在delete後,重設指針的值

執行語句 delete pi;後, pi編成了不確定的指針, 它仍然存放了它之前所指向對象的地址, 然而pi所指的內存已經被釋放, 因此p不再有效.

刪除指針後, 該指針變成懸掛指針. 懸掛指針指向曾經存放對象的內存, 但該對象已經不存在了. 懸掛指針往往導致程序錯誤, 而且很難檢測出來.

一旦刪除了指針所指向的對象, 立即將指針置為0, 這樣就非常清楚地表明指針不再指向任何對象.



 

 

 

二. 創建動態數組

1.動態數組的定義

數組變量通過指定類型, 數組名和維數來定義. 而動態分配數組時, 只需指定類型和數組長度, 不必為數組對象命名, new表達式返回指向新分配數組的第一個元素的指針:

int *pia = new int[10];

此new表達式分配了一個含有10個int型元素的數組, 並返回指向該數組第一個元素的指針, 此返回值初始化了指針pia.

new表達式需要指定指針類型以及在括號中給出的數組維數, 該維數可以是任意的復雜表達式.

2.初始化動態分配的數組

類類型: 使用該類的默認構造函數初始化.

內置類型: 無初始化

string *psa = new string[10]; //一個含有10個空字符串的數組

int *pia= new int[10]; 含有10個未初始化int的數組

也可以使用跟在數組長度後面的一對空括號, 對數組元素做值初始化.

int *pia2 = new int[10] ();

上述表達式把數組元素都設置為0.

對於動態分配的數組, 其元素只能初始化為元素類型的默認值, 而不能像數組變量一樣 , 用初始化列表為數組元素提供各不相同的初值.

 

4.允許動態分配空數組

char *cp = new char[0];

用new動態創建長度為0的數組時, new返回有效的非零指針. 該指針與new返回的其他指針不同, 不能進行解引用操作, 因為畢竟它沒有指向任何元素.

 

5.動態空間的釋放

delete [] pia;

該語句回收了pia所指向的數組, 把相應的內存返還給自由存儲區. 記得要有[] , 否則會導致少釋放了內存空間, 導致內存洩漏.

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved