C 的new delete操作符

2021-09-02 18:52:22 字數 2430 閱讀 5469

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的高八位清零,保留低八位,...