声明:本人工作主要是光电半导体非标自动化设备软件开发,开发环境为windows VS2022, 以下结论仅在VS2022进行验证过,其他平台请自行验证
new的功能(new单个)
new 单个内置类型(int\char\double\bool…)时,没有构造函数,只是调用mallloc申请堆上的内存空间,然后将申请到的地址返回,基本上和malloc一致;
new 自定义类型,首先调用malloc申请内存空间,然后在此空间调用自定义类型的构造函数,开始构造对象,构造完成后返回将对象的地址
new []的功能(new数组)
new内置类型的数组,也是调用malloc申请对应大小的内存空间,然后将首地址返回
new自定义类型的数组,首先申请需求大小空间+4 , 然后从第四个位置开始按顺序调用构造函数构造类对象,然后返回实际申请大小空间首地址+4 ;举例:
class A{}; sizeof(A) = 1;空类大小为 1 ; A *p = new A[10];
1、malloc 空间大小14 , 首地址假设是0x009F5500
2、从首地址0x009F5500 + 4 开始调用构造函数,开始构造类对象
3、返回 0x009F5504 也就是说 p =0x009F5504;
4、那么0x009F5500-0x009F5504存的是设么呢,对,保存的就是new的类对象的个数;
5、实际上此块内存的起始地址是0x009F5500 , 而不是上面返回的p 0x009F5504 , 但是这些不需要我们来处理,系统在调用释放的时候自动处理,不需要我们操心,但是delete 和delete[] 用错的时候将会出现大问题,这个后面再说。
内置类型
自定义类型
1、数组返回的地址并不是系统分配的堆的地址,进行free是必然崩溃;而是加上前四个字节
2、若是delete []p 去释放 new ,系统会去 前四个字节去查询对象个数,然后逐个调用析构函数,完了之后调用free函数,调用free函数时地址是错的