malloc free与new delete的不同
1.底层原理上的差异
malloc 只是在堆上开辟空间(以字节为单位),free配合malloc进行空间的释放
new针对自定义类型,会先调用operator new进行开辟空间,再使用自定义类型的构造函数进行初始化(operator new的用法跟malloc是一样的,功能上都是在堆上开空间)
delete针对自定义类型,会先使用该自定义类型的析构函数进行清理,在调用operator delate进行空间的释放
因为上述底层上的原理差异,所以如果是申请内置类型对象或数组,使用malloc和new并没什么区别。而自定义类型,则差别很大。
2.申请失败时了处理方式不同
使用malloc申请失败了则返回NULL;
使用new申请失败后会抛异常(从 申请失败处往后不再执行后面的程序,直接跳转到catch(捕获异常)处)
/*malloc的使用*/ListNode* p=(ListNode*)malloc(sizeof(ListNode));/*free的使用*/free p;/*单一对象new的使用*/ListNode* p=new ListNode(1);//在底层为operator new +ListNode的构造函数//相当于malloc+ListNode的构造函数+失败抛异常机制/*delete的使用*/delete p;/*数组对象new的使用*/ListNode* p=new ListNode[3]{0,1,2};//{}中的初始化可以省略,省略后直接调用构造函数进行初始化/*数组对象delete的使用*/delete []p;
特殊情况:定位new
new(p)ListNode;也可以加参数:new(p)ListNode(3);
/针对p这块空间调用ListNode的构造函数初始化。/
定位new表达式在实际中一般是配合内存池调用。因为池化分配出来的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化。
思考一下:malloc/new最大能申请多大空间?
如何malloc出4G的空间?
答案会在C++内存管理(二)中公布,链接:查看答案就点这里哦