new运算符虽然用的很久,但是我实际上对它的了解仅仅局限于表面知道和malloc一样可以在堆内存中申请内存,可能会调用对象的构造函数。但是具体的实现和什么时候调用构造函数完全不了解,因此今天在这里进行梳理。
1. new的常见用法
int *a =new int[5];
int *b =new A();
在实际操作中,我们发现A的申请的空间的储存的值为随机值,new仅仅申请了一块随机空间,但是B的申请的空间的值已经初始化了,new调用了A的构造函数。
new A()的功能如下
- 在堆上申请空间
- 在分配的空间上调用对象的构造函数(这也是new和malloc的主要区别,是否调用构造函数)
在调用delete b时的发生的事情是 - 调用该对象的析构函数
- 释放该对象的内存空间
new的具体实现
new的功能可分为两部分
-
分配空间
-
调用构造函数
C++规定这两个功能是由两个函数分别实现的分别是 -
分配空间:operator new
-
调用构造函数:调用palcement new
所以说实际上C++的new的实现过程是关键词new调用表达式new(operator new)来分配空间,这个operator new是一个全局的函数,写在一个文件中,当使用new关键词时,编译器会找到这个函数,并且调用,new操作符的声明如下
void * operator new(std::size_t size) throw(std::bad_alloc)