深入new/delete:New的3种形态

New的3种形态:new operator、operator new、placement new

new 操作符(new 表达式, newoperator, new expression): 通常我们调用 X * pX = new X 时使用的就是这个操作符, 它由语言内建不能重载不能改变其行为. 它包括分配内存的 operator new 和调用构造函数的 placement newnew关键字实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。

operator new :operator new 是一个函数, void *operator new(size_t size) 。它分配指定大小的内存, 可以被重载, 可以添加额外的参数, 但第一个参数必须为 size_t。operator new 除了被 new operator 调用外也可以直接被调用: void * rawMem =operator new(sizeof(X))。这种用法和调用malloc一样。

placement new :placement new 在一块指定的内存上调用构造函数, 包含头文件<new> 之后也可以直接使用placement new: X * pX = new (rawMem) X。

 

与 new operator 类似, 对于 deleteoperator, 也存在 operatordelete: void operator delete(void *), 析构方法 pX->~X().

 

New的基本使用指南:

想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。如果仅仅想分配内存,就应该调用operator new函数;它不会调用构造函数。如果想定制在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用定制的operator new。如果想在一块已经获得指针的内存里建立一个对象,应该用placementnew。placement new主要适用于:在对时间要求非常高的应用程序中,因为这些程序分配的时间是确定的;长时间运行而不被打断的程序;以及执行一个垃圾收集器(garbage collector)。

 

由于placement new的特殊性,下面给出其常规使用步骤:

class Task ; //

char * buff =new char[sizeof(Task)]; // 1) 分配内存

Task *ptask =new(buff) Task;// 2) 构造对象

ptask->suspend(); // 3) 正常使用对象

ptask->resume();

ptask->~Task();  //4) 析构对象

delete [] buff;     // 5) 释放内存

 

      显然,placement new可以提高效率,但增加了程序的复杂度,需要自行管理对象的生存期。Placement new的使用大量存在于STL中。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值