malloc/free和new/delete

来源:互联网 发布:梧州网络问政 编辑:程序博客网 时间:2024/06/03 01:43

malloc和free:malloc的职责就是负责内存的分配,使用malloc函数可以指定的申请一份想要申请的一份空间。

     free负责内存的释放,它与malloc搭配使用,如果使用malloc函数申请了空间,但是在使用完毕后没有释放,则会产生内存泄漏,造成很严重的后果

new和delete : new不仅仅能分配空间,它还会去调相应的析构函数。

         delete和new搭配使用,用来释放使用new申请的空间。


malloc  和new 的差异:⑴malloc是函数,new是操作符 

        ⑵malloc函数只负责空间的分配,new不仅仅只负责空间的分配,而且负责调用构造函数对其初始化

     ⑶malloc函数需要自己计算所需空间字节数的大小,new可以自己计算字节数并为其分配合适大小的空间

free 和 delete 的差异:⑴free是函数,delete是操作符

 ⑵free只负责释放空间, delet不仅仅只负责空间的释放,而且负责调用析构函数来清理数据。




new实际执行了三个步骤,第一个步骤就是调用一个operator new或者operator new[ ] 函数(其中new),分配了一个足够大的,原始的,未命名的空间以便存储特定类型的对象,第二步运行相应的构造函数进行初始化,第三部返回一个指向该空间的 void* 类型的指针。

operator new函数是为一个对象开辟空间,而operator new [ ] 是为多个函数开辟空间,库函数中的这俩个函数并没有重载 new 操作符。

如果是自定义对象,且该对象自定义了析构函数,则operator new[ ] 在开辟空间的时候会为其在空间的头部多开辟4个字节大小的空间,用来记录在销毁时需要调用几次析构函数,

operator new和operator new[ ] 函数中开辟空间时其实也是调用malloc函数。



delete实际执行了俩个步骤,第一步首先调用其析构函数,执行了析构函数内的命令,第二部调用了operator delete或者operator delete[ ]来销毁指针指向的这段空间。

在销毁用自定义类型开辟的空间时,delete+指针 首先销毁指针所指向的空间内的数据,然后销毁指针指向的空间,delete[ ] +指针 是用来销毁数组中的元素,然后再销毁对应的空间。


new和delete ,new[ ]和delete[ ]最好匹配起来使用,这是为什么呢?

因为new只开辟了一个对象的大小,调用了一次构造函数,delete在释放空间前也只会去调用一次析构函数。

new[ ] 一次性开辟了多个空间的大小,如果当用户自定义了析构函数时,编译器会在空间的头部多开辟4个字节的空间来记录需要调用析构函数的次数(例如 new[11] 空间的前4个字节会记录11),然后将指针后移4个字节的大小并返回指针。如果用delete来释放空间时,此时编译器会直接从空间的第5个字节处开始释放,导致程序崩溃;而delete[ ] 会在当前指针的前4个字节处释放空间,并且delete[ ]会去调用相应次数的析构函数,调用完析构函数时再释放空间,不会崩溃。




原创粉丝点击