new的基本和高階用法
1、new 的基本用法
int *a = new int[5];
class a //宣告乙個類 a
a *obj = new a(); //使用 new 建立物件
delete a;
delete obj;
這裡我們注意,new int[5] 僅僅分配了空間, 但是 new a(),不僅僅為物件obj在隊上分配了空間, 而且還呼叫了 a的建構函式,生成了這個物件。
所以 new a() 這樣方式的功能如下:
- 在堆上分配空間
- 在分配的空間上呼叫物件的建構函式
(這也是 new 和 malloc的主要區別,是否呼叫建構函式)
同理: 在呼叫 delete obj的時候:
1. 首先呼叫 這個物件 的析構函式
2. 然後釋放這個物件的空間
new 的公升級版本 (version 1)
從上面可以看到:new 的功能是 1. 分配空間, 2 呼叫建構函式。 那麼到底是如何實現的呢?
其實 c++ 規定 new 的 這 兩個功能分開實現:
1. 分配空間: 呼叫函式 operator new 來實現。
2. 呼叫建構函式: 呼叫 placement new 來實現。
現在有三個 new 了,第乙個new就是我們常說的new, 這個new 呼叫 接下來的兩個new 來實現它的功能。 (我們稱這個 new 為, new operator,叫做「new 表示式」,因為operator 在 new 後面,所以 叫做 「new 表示式」,也就是關鍵字)
new關鍵字 會呼叫 operator new 分配空間: 這裡 operator new 是乙個全域性的函式,寫在乙個檔案中。當使用 new 關鍵字 的時候,編譯器會自動找到這個函式,並且呼叫這個函式:這個函式的宣告如下:
// 全域性 operator new
void * operator new(std::size_t size) throw(std::bad_alloc)
return p;
}// 對應的全域性 operator delete 採用 free 釋放空間
void operator delete(void* ptr)
這個 operator new 函式稱為 全域性 operator new 。 (這裡稱為 全域性 主要是因為 每個類 還可以 過載 自己的 operator new() 函式)
全域性 operator new 分配空間
從上個例子中可以看到, 全域性 operator new 分配空間,簡單的呼叫了 malloc() 函式來分配空間。 並沒有做任何初始化工作。
現在問題來了: 已經有了一段分配好的空間 ,如何在這個空間上 調動這個類的建構函式,從而真正的建立乙個物件呢? (你需要對 物件的 記憶體模型 有一定的了解)。 解決方案是: placement new
placement new 呼叫建構函式
placement new 的功能就是 在乙個 已經分配好的空間上,呼叫建構函式,建立乙個類。
placement new 就這乙個用法,知道如何用就可以了,它不是乙個(寫在檔案中)函式,是編譯器編譯時候做的事情。
用法如下:
void *buf = // 在這裡為buf分配記憶體
class *pc = new (buf) class();
舉例子:
class a //宣告乙個 類 a
void *buf = malloc(sizeof(a)); //簡單地分配空間。
a *ojb = new (buf)a(); // 在分配的空間上呼叫建構函式。
現在問題來了: 這裡 的空間可以是任意的空間嗎,答案是的! 這裡的 「已經分配好的空間」 可以是任何的空間,比如說 可以是棧上的空間!
class a
int buf[sizeof(a)]; //在棧上,分配乙個陣列
a *obj = new(buf) a(); //在這個陣列上構造乙個 物件 a。
new 的公升級版本 (version 2)
我們稱上乙個 operator new 為 全域性operator new ,因為它是乙個檔案中的函式。
1. 於是我們就可以對 operator new 進行過載了:
2. 過載之後,我們可以在其中自己進行記憶體分配。(比如說,不使用 malloc進行實現)
但是過載 operator 必須非常的注意!
文章說的非常好, 有非常多的注意事項! 有好處也有壞處,
陳碩的文章 說的也非常好! 值得一看,看不懂別怪我。
這裡的公升級版本是: 可以在類中過載 operator new 和 placement new。 這個需要在 google 上搜尋一下。
C 筆記,過載new , delete 操作符
1.簡述 1 自定義過載全域性的new 和 delete,在使用new新增物件和delete物件時,會呼叫自定義全域性的new和delete操作,c 內部類也 如char,int等 不例外,同樣會呼叫自定義的new和delete。2 也可以定義作用域為當前類的new和delete,即像在類中過載其他...
C 基礎學習7 new delete操作符
在c語言中,動態分配和釋放記憶體的函式是malloc calloc和free,而在c 語言中,new new delete和delete操作符通常會被用來動態地分配記憶體和釋放記憶體。需要注意的是new new delete和delete是操作符,而非函式 new和delete也是c 的關鍵字。操作...
c語言操作符 位操作符 移位操作符
1 按位操作符 1.1 按位 與 雙目運算子 僅當兩個運算元都為1時,結果為1,否則為0。參與運算的數以補碼方式出現。例 9 5 1 0000 1001 9的補碼 0000 0101 5的補碼 0000 0001 1的補碼 應用 a 通常將某些位清零或保留某些位。例如 將a的高八位清零,保留低八位,...