C++内存管理(new操作符和delete操作符)

##new操作符和delete操作符
1. 使用new [类型] 可以申请一个[类型]的空间,返回值为[类型]的指针,例如new int(申请单个类型的空间) , new int[10](申请数组的空间)。
2. new申请的空间也是在堆里。
3. 使用new [单个类型](初始化值) 可以进行初始化,连续的空间不可以使用此方式进行初始化
4. 用delete [单个类型] 来释放单个类型的空间,用delete []来释放申请的连续的空间。
5. new申请的空间的时候会调用类的构造函数,delete在销毁空间的时候会调用类的析构函数,而maloc家族只是在堆上划分空间,free只是将空间归还给操作系统,并不会调用任何的函数。

new操作符申请类类型空间的流程

  1. 首先是在堆上申请相应大小的空间(循环使用malloc,直到申请成功,申请失败则会判断是否要抛出异常)
  2. 然后再编译的时候,编译器会加测new后面的类型是否是类类型(即是否需要构造),如果需要构造,编译器会调用其构造函数。

delete操作符释放类类型空间的流程

  1. 编译器首先会判断new 后面的指针类型是否指向一个对象(即是否可以调用析构函数),如果可以,则会调用析构函数。
  2. 析构函数调用完成之后再将此块空间归还给操作系统(调用free进行释放 )。

new[]操作符的申请类类型空间流程

  1. 如果要申请的类类型含有显式的析构函数,那么new会申请实际数组的大小加上4个字节,这4个字节用于存储数组元素的个数,并且位于数据空间的前面。
  2. 申请空间完成之后,会调用每个元素的构造函数,即有多少元素就调用多少次。

delete[]操作符释放空间的流程

  1. 首先判断析构函数是否显式的给出,如果是,那么就先找到最先分配的四个字节,得到对象的个数,然后进行逐个销毁。
  2. 销毁完成之后调用delete[] 销毁此块空间加上前面的4个字节。

内存池

       有时我们不停地需要一个一个对象,但是每次使用new的话是非常浪费空间的,因为每次使用new的时候都会调用malloc,而malloc在申请内存的时候会浪费很多空间用来维护内存空间的数据,所以我们可以使用malloc一次性开辟一大块空间,然后每次用的时候在里面一块一块的拿即可,此时就要用到定位new表达式:

Test *pt = (Test *)malloc(sizeof(Test) * 100);
new(pt) Test;//每次需要对象的时候直接通过  定位new表达式 在已申请的空间中进行构造即可

malloc/free 和 new/delete的区别

  1. malloc/free是函数,需要头文件支持,new/delete是操作符,不需要头文件支持
  2. malloc申请内存需要字节数,new申请内存需要类型
  3. malloc返回值为void*,new返回值为指定类型的指针
  4. malloc申请空间失败返回NULL,new申请失败抛出异常
  5. malloc不会调用构造函数,不能初始化变量,new可以调用构造函数,可以初始化申请的空间(数组除外),free不会调用析构函数,delete会调用析构函数。
  6. new用内存池不一定在堆空间中申请内存,在哪儿开辟的内存,使用定位new表达式的时候,就会从哪儿申请内存。

猜你喜欢

转载自blog.csdn.net/qq_38590948/article/details/81462871
今日推荐