2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > C++内存管理——空间申请 释放的新玩法

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

时间:2022-11-13 09:24:07

相关推荐

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。