C++内存管理——空间申请、释放的新玩法

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++内存管理(二)中公布,链接:查看答案就点这里哦

你可能感兴趣的:(笔记,c++,开发语言,后端)