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)。

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