面向对象语言的new操作
下面是一段简单的C++代码,分下一下new操作符究竟干了一些什么。
- class Person
- {
- public:
- Person(){}
- ~Person(){}
- int name;
- int age;
- };
- class son:public Person
- {
- public:
- son(){}
- ~son(){}
- int toy;
- };
- Person * p= new Person();
- p->name = 44;
- p->age = 30;
- Person* s = new son();
- s->name = 44;
在new的地方,我们按f11跟踪进去。new是封装malloc,按照对象的大小申请内存。我们看到size是8,正好等于person中2个int的大小。
- void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
- { // try to allocate size bytes
- void *p;
- while ((p = malloc(size)) == 0)
- if (_callnewh(size) == 0)
- { // report no memory
- static const std::bad_alloc nomem;
- _RAISE(nomem);
- }
- return (p);
- }
那malloc又做了些什么操作呢。调用了 dbgmalloc.c 和dbgheap.c.
- extern "C" _CRTIMP void * __cdecl malloc (
- size_t nSize
- )
- {
- void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
- RTCCALLBACK(_RTC_Allocate_hook, (res, nSize, 0));
- return res;
- }
extern "C" void * __cdecl _nh_malloc_dbg (
- size_t nSize,
- int nhFlag,
- int nBlockUse,
- const char * szFileName,
- int nLine
- )
- {
- int errno_tmp = 0;
- void * pvBlk = _nh_malloc_dbg_impl(nSize, nhFlag, nBlockUse, szFileName, nLine, &errno_tmp);
- if ( pvBlk == NULL && errno_tmp != 0 && _errno())
- {
- errno = errno_tmp; // recall, #define errno *_errno()
- }
- return pvBlk;
- }
没有深究,有时间补上,有研究的童鞋请赐教
参考文章:http://blog.csdn.net/hejinjing_tom_com/article/details/4059711
我们知道new操作要调用对应的构造函数,可是我们在new操作的代码中并没有看到调用构造函数的任何代码,我们被书忽悠了?
那构造函数又是什么时候调用的呢。
请参考
一件被误导很久的事:关于new和delete
点击debug菜单window中的disassembly,查看汇编代码,很容易找到如下代码
Person * p= new Person(); 00171860 push 28h 00171862 call 00171867 add esp,4 0017186A mov dword ptr [ebp-1A0h],eax 00171870 mov dword ptr [ebp-4],1 00171877 cmp dword ptr [ebp-1A0h],0 0017187E je test+103h (171893h) 00171880 mov ecx,dword ptr [ebp-1A0h] 00171886 call 0017188B mov dword ptr [ebp-1CCh],eax 00171891 jmp test+10Dh (17189Dh) 00171893 mov dword ptr [ebp-1CCh],0 0017189D mov eax,dword ptr [ebp-1CCh] 001718A3 mov dword ptr [ebp-1ACh],eax 001718A9 mov dword ptr [ebp-4],0FFFFFFFFh 001718B0 mov ecx,dword ptr [ebp-1ACh] 001718B6 mov dword ptr [ebp-20h],ecx p->name = "44";
对比C++代码,在 Person * p= new Person(); 和p->name = "44"中间的应该就是new运算符对应的汇编。
我们分析对构造函数的调用应该是编译器插入的。 至于怎么插入的,现在还不太明白。
参考文章:http://hi.baidu.com/linx214/blog/item/62251ace1f970e35f8dc6116.html
这个没有找到原帖,抱歉。
子类是怎样调用父类的成员函数的 http://blog.csdn.net/wishfly/article/details/5030381
C++:从子类访问父类的私有函数 http://hi.baidu.com/structureit/blog/item/3b041f6d86945af64216940c.html
http://campolake.iteye.com/blog/1195685
原文地址:
http://campolake.iteye.com/blog/1195685
转载于:https://www.cnblogs.com/campo/archive/2011/10/14/2211983.html
面向对象语言的new操作相关推荐
- python面向对象的三个基本特征 含义和作用简介_面向对象语言的三个基本特征各自特点及优势...
展开全部 面向对象语言的三个基本特征:识认性.类别性.多态性:优势:继承性,在基本层次关系的不e69da5e6ba9032313133353236313431303231363533313334336 ...
- java面向对象语言_Java到底是不是一种纯面向对象语言?
英文原文:Why Java Is a Purely Object-Oriented Language Or Why Not Java是否确实是 "纯面向对象"?让我们深入到Java ...
- 面向对象语言的技术特点
1.支持类与对象概念的机制 所有面向对象语言都允许用户动态创建对象,并且可以用指针引用动态创建的对象.允许动态创建对象,就意味着系统必须处理内存管理问题,如果不及时释放不再需要的对象所占用的内存,动态 ...
- c不是面向对象编程语言 所以不具有面对,go 学习笔记之go是不是面向对象语言是否支持面对对象编程?...
面向对象编程风格深受广大开发者喜欢,尤其是以 C++, Java 为典型代表的编程语言大行其道,十分流行! 有意思的是这两中语言几乎毫无意外都来源于 C 语言,却不同于 C 的面向过程编程,这种面向对 ...
- Java——一种彻底的面向对象语言
在 Java 世界里,Everything is object.也就意味着 Java 是一种彻底的面向对象语言,彻底对应着everything. 使用 Java 无论想实现何种代码逻辑,首先需要定义类 ...
- 面向对象语言导论(节选) 1(ZT)
(译自Martin Abadi, Luca Cardelli的对象理论一书的第一部分) 译者前言 这本书是我们上面向对象类型理论的教材.当时上这门课时,心里满不以为然,觉得自己的C++和OO已经颇有造 ...
- 清华郑丽c语言编程,面向对象语言c+综合实验指导书.doc
面向对象语言c综合实验指导书 <面向对象程序设计> 综合实验指导书 课程名称:面向对象程序设计 适用专业:计算机科学与技术 制 定 人:丁智国 编写日期:2009 年5月 浙江师范大学数理 ...
- linux下 面向对象语言,人工智能(AI)程序设计(面向对象语言)PDF+PPT与习题等...
智能化是当前计算机.自动化.通信.管理等信息科学技术领域中的新方法.新技术.新产品的重要发展方向与开发策略之一.信息处理的智能化与信息社会对智能的巨大需求是人工智能发展的强大动力.人工智能与专家系统曾 ...
- java和其他语言相比 特点,【单选题】与其他面向对象语言相比,Java语言突出的特点是:...
[单选题]与其他面向对象语言相比,Java语言突出的特点是: 更多相关问题 55 A fresh B soft C deep D warm 13 Many economists have given ...
最新文章
- 常用CSS缩写语法总结
- PyWebIO,让 Pandas 原地起飞的神器!
- python函数(二)
- 如何在Eclipse里方便地进行markdown文件编辑
- 为什么公司宁愿花25K重新招人,也不愿花20K留住老员工?
- 送书 | 人类细胞图谱计划发起人Aviv Regev博士讲单细胞基因组学
- Redis - 数据持久化
- (PHP 4, PHP 5) isset — 检测变量是否设置
- http 协议入门
- C# List 深复制
- Oracle函数-分析函数-获取上一条(下一条)记录
- Ansible最佳实践之委派任务和事实
- 知识图谱实体预测任务如何计算filtered MRR
- PPPD chat中文帮助
- 长波猝灭剂QSY 21NHS,304014-13-9,QSY21 活性酯特点有哪些
- matlab 7.1教程pdf,MATLAB7[1].0入门教程.ppt
- 局域网访问mysql
- 解决生产环境一次tomcat无故宕机的诡异问题
- MATLAB 基础知识 数据类型 时间表 按行时间和变量类型选择时间表数据
- .\Objects\stm32f103c8t6_all_in_one.axf: Error: L6218E: Undefined symbol EXTI_ClearITPendingBit (refe
热门文章
- 建立UDP到虚拟串口的映射软件 : USR-VCOM,并应用到WiFi调试ESP32
- 2021年春季学期-信号与系统-第四次作业参考答案-第十二小题
- 蜗杆单轨滑轨的驱动的统一接口
- ZLAN串口转接以太网ZLSN3003S
- 批处理处理远程计算机,使用批处理文件在远程计算机上调整PowerShell窗口的大小...
- html模板编辑器,可视化编辑网站模板
- 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告
- php左右值实现无限极分类,基于ThinkPHP的二叉树左右值无限极分类实现
- rap 接口管理 java_有没有类似阿里rap的api管理方案(rap太卡了)
- matlab直方图绘制