引入
如何申请内存?使用malloc/new,如何为一个类对象申请内存呢?使用new,为什么要设计两套接口呢?差异是什么?
malloc和new的差异
malloc
第一条指令是把数值4赋给寄存器edi,为后面的函数调用准备参数,详细分析见CPU里的参数传递。
第二条指令是调用malloc函数,可以猜出这是要申请4个字节大小的内存块,这样看来malloc是一个单纯的函数,输入所需的内存的大小就可以帮我们申请想要大小的内存块。
new
前两条指令跟malloc十分相似,第一条指令是传递参数值8,因为类A仅有2个int类型的成员变量,所以A的大小是8个字节,
到目前为止注意类对象还需要调用构造函数进行初始化。
下面两条指令,第一条指令:把申请到的内存地址传递给寄存器rdi(调用构造函数也是需要传递this指针的)
完成了this指针的传递就可调用类A的构造函数了,及最后一条指令。
至此new操作全部完成。
free和delete的差异
free
free是malloc的反向操作,也是一个纯函数接口。它的用途是释放归还刚才申请的内存。
delete
delete是new 的反向操作,首先调用类A的析构函数
然后就可以跟free一样释放、归还类A对象所占据的内存空间。
总结
1.malloc和free都是单纯的函数用申请内存和归还内存。 2.new包含了两个操作,第一个操作跟malloc类似,也是申请内存,第二个操作是对申请到的内存,也就是类A的示例对象,进行初始化,就是调用A的构造函数。至于delet 函数正好相反 3.无论是malloc还是new,它们都是可以被重载的。(默认情况下这二者都是从堆区申请内存的。)