一、應用格式:
type_name * pointer_name = new type_name [num_elements];
delete pointer_name; //加不加取決於new有沒有用,兩者必須對應。
tips:
1、delete僅僅釋放指標指向的記憶體,而不刪除指標本身。
2、注意覆蓋與新建的區別,**如下:
#include #include using namespace std;
int main()
二、定位運算子new:(new運算子的變體)
1、使用前應包含標頭檔案new,#include 。
2、格式:pointer_name1 = new (pointer_name2) int[num] //在pointer_name2所指向的儲存空間中開闢出int[num]個位元組的空間,用於儲存int資料,並把首位位址賦給pointer_name1。int也可以是其他型別。若分配的位置原來有其他值,則會被覆蓋。
3、用定位運算子建立物件後,若要刪除物件,不能用delete,因為delete只與常規new運算子對應,而不與定位運算子對應。所以必須顯式的為定位運算子new建立的物件呼叫析構函式。**如下:
char * fp = new char[40]; /*這裡的char[4]僅僅表示1(char)*40個位元組,不代表存入的資料一定為char*/
class_name *sp;
*sp = new (fp) class_name;
sp->~class_name(); /*顯式呼叫析構函式*/
三、new/delete與動態陣列:讀取100個字串並輸出,各字串長短不一,但均小於80.**如下:
#include #include using namespace std;
char * getname(void);
int main()
return 0;
}char * getname() /*這一塊內容實現了動態記憶體分配*/
四、new/delete與類構造:
1、建構函式:應用new即可。
2、複製建構函式:應該自定義複製建構函式,不能使用預設的。因為預設的複製建構函式會導致不同物件的指標成員指向同一記憶體塊,進而導致在呼叫析構函式的時候,對同一記憶體塊使用兩次delete,引發錯誤。
3、賦值運算子:應該使用自定義賦值運算子,原因同複製建構函式。正確**如下:
/*類class_name中的成員包括指向字串的指標pointer_name,int型的字串長度值len*/
class_name & class_name::operator=(const class_name & cn)
4、析構函式:
新增delet pointer_name 即可。加不加看情況。若物件用new建立,則析構函式不會自動呼叫,除非顯式使用delete刪除物件,才會呼叫析構函式。
五、類繼承中的new/delete
1、基類使用new,派生類不使用new,不需要做特殊的改進。
2、基類使用new,派生類使用new,易知需要為派生類重新設定與new匹配的析構函式,複製建構函式等。
a、析構函式,因為派生類析構函式會自動呼叫基類析構函式處理基類部分資料,所以派生類析構函
數隻需要處理派生類中新增的資料部分即可。
b、複製建構函式,sa::sa(const sa & sa) : fa(sa) //必須像這樣使用初始化列表呼叫基類複製構造函
數。c、賦值運算子:在類方法實現中顯式呼叫基類賦值運算子過載函式。**如下:
sa & sa::operator=(const & sa)
new delete 基礎應用
include iostream using namespace std int main 這裡面只需要注意一點就是基礎型別和陣列型別的刪除區別就ok。1.區別 include iostream using namespace std class myclass myclass private in...
ConcurrentHashMap應用注意事項
1 public v get object key 不涉及到鎖,也就是說獲得物件時沒有使用鎖 2 keyset iterator 及keys 獲取的iterator enumeration變數是單執行緒訪問安全的,多執行緒訪問時要麼生成多個iterator enumeration 通過呼叫相應的獲取...
new delete以及異常處理的相關舉例
new 一般用法 new 型別 初值 比如 int i new int int j new int 100 int k new int 3 delete 一般用法 delete 指標變數 比如 delete i delete j delete k 簡單來說,即為乙個申請空間,乙個釋放空間,在不知陣列...