文章目录
前言
早餐店的老板问我要点什么,我说我要肆意妄为,志得意满,要梨花带雨和人见人爱,开个玩笑,我已经长大了,我要两根油条和一份豆浆。
一、new和delete是如何实现的?
new的实现过程是:
1、new简单类型直接调用operator new分配内存;
2、对于复杂结构:首先调用名为operator new的标准库函数,分配内存,接下来调用该类型对象的构造函数,最后返回指向新分配并构造后的对象的指针
3、对于简单类型,new[]计算好大小后调用operator new;
4、对于复杂数据结构,new[]先调用operator new[]分配内存,然后在p的前四个字节写入数组大小n,然后调用n次构造函数,针对复杂类型,new[]会额外存储数组大小;
delete的实现过程:
1、delete简单数据类型默认只是调用free函数;复杂数据类型先调用析构函数再调用operator delete 释放该对象所占内存;
2、针对简单类型,delete和delete[]等同。假设指针p指向new[]分配的内存。因为要4字节存储数组大小,实际分配的内存地址为[p-4],系统记录的也是这个地址。delete[]实际释放的就是p-4指向的内存。而delete会直接释放p指向的内存,这个内存根本没有被系统记录,所以会崩溃。
3、需要在new []一个对象数组时,需要保存数组的维度,C++的做法是在分配数组空间时多分配了4个字节的大小,专门保存数组的大小,在delete []时就可以取出这个保存的数,就知道了需要调用析构函数多少次了。