- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
深入C++的newnew是C++的一个关键字,同时也是操作符。关于new的.doc
深入C++的new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,下面我将把我了解到的与new有关的内容做一个总结。可能有些深入,不同的同学可能会有不同的收获, 希望通过我的讲解,大家能对动态内存管理及new与delete有清晰的理解.
new的过程
当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:
class A{
?? int i;
public:
?? A(int _i) :i(_i*_i) {}
?? void Say() { printf(i=%dn, i); }
};
//调用new:
A* pa = new A(3);
那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上):
A* pa = (A*)malloc(sizeof(A));
pa-A::A(3);
return pa;
虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。因此我们还是要尽可能的使用new,除非有一些特殊的需求。
new的三种形态(了解一下就可以了^_^)
到目前为止,本辅导文章所提到的new都是指的“new operator”或称为“new expression”,但事实上在C++中一提到new,至少可能代表以下三种含义:new operator、operator new、placement new。
new operator就是我们平时所使用的new,其行为就是前面所说的三个步骤,我们不能更改它。但具体到某一步骤中的行为,如果它不满足我们的具体要求 时,我们是有可能更改它的。三个步骤中最后一步只是简单的做一个指针的类型转换,没什么可说的,并且在编译出的代码中也并不需要这种转换,只是人为的认识 罢了。但前两步就有些内容了。
new operator的第一步分配内存实际上是通过调用operator new来完成的,这里的new实际上是像加减乘除一样的操作符,因此也是可以重载的。operator new默认情况下首先调用分配内存的代码,尝试得到一段堆上的空间,如果成功就返回,如果失败,则转而去调用一个new_hander,然后继续重复前面 过程。如果我们对这个过程不满意,就可以重载operator new,来设置我们希望的行为。例如:
class A
{
public:
?? void* operator new(size_t size)
?? {?????? printf(operator new calledn);
?????? return ::operator new(size);
?? }
};
A* a = new A();
这里通过::operator new调用了原有的全局的new,实现了在分配内存之前输出一句话。全局的operator new也是可以重载的,但这样一来就不能再递归的使用new来分配内存,而只能使用malloc了:
void* operator new(size_t size){
?? printf(global newn);
?? return malloc(size);
}
相应的,delete也有delete operator和operator delete之分,后者也是可以重载的。并且,如果重载了operator new,就应该也相应的重载operator delete,这是良好的编程习惯。
new的第三种形态——placement new是用来实现定位构造的,因此可以实现new operator三步操作中的第二步,也就是在取得了一块可以容纳指定类型对象的内存后,在这块内存上构造一个对象,这有点类似于前面代码中的“p- A::A(3);”这句话,但这并不是一个标准的写法,正确的写法是使用placement new:
#include new.h
void main()
{?? char s[sizeof(A)];
?? A* p = (A*)s;
?? new(p) A(3);
//p-A::A(3);
?? p-Say();}
对头文件new或new.h的引用是必须的,这样才 可以使用placement new。这里“new(p) A(3)”这种奇怪的写法便是placement new了,它实现了在指定内存地址上用指定类型的构造函数来构造一个对象的功能,后面A(3)就是对构造函数的显式调用。这里不难发现,这块指定的地址既 可以是栈,又可以是堆,pla
您可能关注的文档
- 汇总版软件安装操作说明.doc.doc
- 汇文系统应用(编目).ppt
- 汇编语言扩展汇编语言程序设计.ppt
- 汇编语言程序设计第九章BIOS和DOS中断.ppt
- 汉字及其汉字教学.ppt.ppt
- 江苏四市政府绩效评估指标挖掘结果-甘肃行政学院.doc
- 江苏文化共享工程方案介绍-江苏公共数字文化网.ppt
- 江苏省人力资源社会保障信息化工作考核评分说明.doc.doc
- 江苏省定制式义齿生产企业质量管理体系现场检查申请表.doc.doc
- 污水下水道用户接管申请书及土地使用同意书-国洋环境科技股份有限公司.doc
- 深圳大数据产学研联盟沙龙—.doc
- 深圳学生如何考入重点高中-Huawei.ppt
- 深圳市人力资源和社会保障局信息中心计算机防病毒软件招标书.doc.doc
- 深圳市人力资源和社会保障局金融社保卡应用功能扩展项目招标书我局.doc
- 深圳市人才引进综合评价分值表(2017年)-深圳市人力资源和社会保障局.doc
- 深圳市第二职业技术学校定制手机存贮盒.doc
- 深圳市职业技能鉴定服装设计定制工考核大纲-深圳市人力资源和社会.doc
- 深圳市职业技能鉴定服装设计定制工(中、高级)考试大纲.doc
- 深圳市西遇时尚服饰有限公司--2017管理培训生招聘简章.doc
- 深圳玛丝菲尔时装股份有限公司首次公开发行股票申请文件-中国证监会.doc
最近下载
- 小学科学新教科版二年级上册第一单元 造房子教案(共6课)(2025秋).docx VIP
- 2025年广西公需科目第二套答案.docx VIP
- 设备供货配送方案.docx VIP
- 现代农业发展情况课件.ppt VIP
- 2025年广西专业技术人员继续教育公需科目(二)答案.docx VIP
- 《急诊与灾难医学》全套课件.pptx
- 精通版五年级英语上册Lesson3_教学课件.ppt VIP
- 农村公路畅通工程质量检测方案(第三方检测及交工验收).docx VIP
- 《现代农业发展》课件.ppt VIP
- 2025广西公需科目考试答案(3套涵盖95-试题)一区两地一园一通道建设人工智能时代的机遇与挑战.docx VIP
文档评论(0)