C++ Q&A(五) 再論new操作符

聲明:Q&A系列的文章是我在平時自己遇到的或者看到的一些問題,本着再小的問題也需要有人解答的想法,將這些問題和答案整理出來。

歡迎和我討論問題,同時也歡迎轉載Q&A系列的文章。

new operator: 指的是一般情況下我們使用的new運算符,C++primer中叫做new experssion

operator new:operator new 是一個函數。用來分配空間,和C標準庫中的malloc函數的作用是一樣,返回值的類型爲void *,這個函數不會調用對象的構造函數,而是調用new_handler
placement new: 一般的實現是返回一個void *。

new operator是C++內置的一個操作。new operator 調用operator new或者placemnet new。而operator new和placement new可以被重載。
舉個例子:
class Base {
public :
  void *operator new(size_t size) {
    printf("Base's operator new\n");
    return ::operator new (size);
  }
  void *operator new (size_t, void *p){
    return p;
  }
  Base() {
    printf("Base's constructor\n");
  }
};

使用的比較多的,是operator new。執行的其實只是分配空間。這個函數的參數爲size_t類型,調用這個函數就可以獲得相應大小的內存。
placement使用的比較少。在調用placement new的時候,new operator會自動調用對應的構造函數,在所傳入的指針所指的內存中構造出一個對象。

爲什麼operator new和placement new要返回空類型的指針?
因爲new operator是在調用構造函數之前調用這兩個函數的,在這個時候,還不知道是什麼類型,因爲類型還沒被構建起來。


更多的,有當 operator new 或 placement new 返回空指針的時候,構造函數是不會執行的,不過這個要根據編譯器而定,我在VS2013下返回空指針是不會調用構造函數的。就像這樣:
  void *operator new(size_t size) {
    printf("Base's operator new\n");
    return NULL;
  }
  void *operator new (size_t, void *p){
    return NULL;
  }


當執行operator new的時候內存不夠的話,有的編譯器會返回NULL,有的編譯器則是拋出異常,一般新進的編譯器都是拋出異常了。

加上繼承的operator new:
其實加上繼承的operator new和其他的成員函數是一樣的,可以重載也可以不重載,在使用new operator的時候如果派生類的operator new存在,就會調用派生類的operator new,否則就調用基類的operator new(如果基類有的話,基類也沒有就調用默認的那個operator new)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章