C/CPP中的malloc和new的差异

2022-11-14 15:10:32 浏览数 (1)

引入

如何申请内存?使用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,它们都是可以被重载的。(默认情况下这二者都是从堆区申请内存的。)

0 人点赞