C++ 中“new 運算子”和“operator new”的區別?
在 C++ 中,當我們想要建立一個新的物件時,必須在記憶體中建立一個記憶體塊,然後還要呼叫建構函式來初始化該記憶體塊。我們可以使用 new 關鍵字來建立記憶體元素。這個 new 運算子執行了兩個連續的任務。但是 operator new 僅建立記憶體空間。
New 關鍵字
new 運算子是一種特殊的運算子,表示對堆部分進行記憶體分配的請求。只有在有足夠的可用記憶體時,new 運算子才會將記憶體初始化到指標變數。當我們使用普通的 new 關鍵字建立物件時,它會執行兩個連續的任務
- ? 為物件分配堆部分的記憶體塊
- ? 呼叫建構函式初始化記憶體塊。
示例程式碼
#include <iostream> using namespace std; class Box { public: Box() { cout << "Constructor called!" <<endl; } }; int main() { Box* myBox = new Box; }
輸出
Constructor called!
Operator New
operator new 是一個函式。此函式用於過載 new 運算子。使用它,我們可以分配原始記憶體塊。這在概念上類似於 malloc() 或 calloc() 函式。此函式不呼叫建構函式,因此記憶體未初始化。但是,在從該過載方法返回指標後,編譯器會在之後呼叫建構函式。
示例程式碼
#include <iostream> #include <cstdlib> using namespace std; class Box { public: Box() { cout << "Constructor called!" <<endl; } void *operator new(size_t size) { cout << "Call Operator New"<<endl; void *p = malloc(size); return p; } }; int main() { Box* myBox = new Box; }
輸出
Call Operator New Constructor called!
廣告