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!

更新於: 2019年7月30日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告