下面是一段简单的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
深入C++的new
我们知道new操作要调用对应的构造函数,可是我们在new操作的代码中并没有看到调用构造函数的任何代码,我们被书忽悠了?
那构造函数又是什么时候调用的呢。
请参考
点击debug菜单window中的disassembly,查看汇编代码,很容易找到如下代码
Person * p= new Person();
00171860 push 28h
00171862 call operator new (17131Bh)
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 Person::Person (1713B6h)
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运算符对应的汇编。
对类a的构造函数的调用,是编译器偷偷在你的函数里插入的,当时的情况就是如此。delete的情况也是一摸一样。
我们分析对构造函数的调用应该是编译器插入的。 至于怎么插入的,现在还不太明白。
参考文章:http://hi.baidu.com/linx214/blog/item/62251ace1f970e35f8dc6116.html
这个没有找到原帖,抱歉。
子类是怎样调用父类的成员函数的 http://blog.csdn.net/wishfly/article/details/5030381
分享到:
相关推荐
面向对象编程是Java语言的核心特性,它以类和对象为基石,强调数据封装、继承和多态性。在这个实验中,我们将深入理解这些概念,并通过实际编程和上机操作来巩固理论知识。 首先,要体现面向对象思想,关键在于理解...
在本课件"面向对象技术课件-New"中,我们可以深入探讨这一主题。 1. **面向对象的基本概念**:面向对象技术的核心思想包括类、对象、继承、封装和多态。类是对象的模板,定义了对象的属性和行为;对象是类的实例,...
面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它基于“对象”的概念...这些概念不仅适用于C++,也是许多其他面向对象语言的基础。掌握它们,将有助于提升你的编程能力和软件开发水平。
面向对象的程序设计语言(Object-Oriented Programming Language,简称OOP)是现代软件开发中的重要概念,C++就是一种广泛使用的OOP语言。本文将深入探讨C++的面向对象特性,包括类、对象、封装、继承、多态等核心...
Java是一种广泛使用的面向对象编程语言,它封装了数据和操作数据的行为,并支持继承和多态特性,使得Java程序可以高度模块化和复用。在Java中,面向对象编程(OOP)的三大基本特性是封装、继承和多态。 封装是面向...
**JAVA面向对象程序设计语言** Java是一种广泛使用的高级编程语言,以其面向对象的特性而闻名。面向对象编程(Object-Oriented Programming, OOP)是Java的核心理念,它基于类和对象,允许开发者以更接近人类思维...
在Python的世界里,面向对象编程(Object-Oriented Programming, OOP)是核心编程范式之一,它允许我们将复杂的问题拆解为一系列可复用的对象,极大地提高了代码的可维护性和可扩展性。《Python面向对象编程指南》这...
在C++编程语言中,C语言的简单和高效与面向对象的特性相结合,使得开发者能够构建更为复杂的系统。本文将深入探讨C++中的"new"和"delete"操作符,这是理解和掌握C++内存管理的关键。 面向对象编程(Object-Oriented...
总的来说,C#编程语言与面向对象基础教程旨在帮助学习者建立坚实的面向对象编程基础,并通过C#这门语言来掌握面向对象技术的核心概念和实现方法,从而在Web开发等领域的应用中能够更加得心应手。
殷人昆编著的《数据结构(用面向对象的方法与C++语言描述)》第二版,是一本深入讲解数据结构的经典教材,特别适合计算机专业的学生和程序员学习。此压缩包包含教师PPT和课后习题解答,为学习者提供了丰富的教学资源...
Java语言是目前广泛应用的编程语言,以其面向对象的特性、平台独立性以及强大的类库支持深受程序员喜爱。《面向对象程序设计设计》第二版由王行言编著,该书深入浅出地介绍了Java编程的核心概念和技术,是学习Java...
面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它基于“对象”的概念,将数据和操作这些数据的方法封装在一起。在Python中,面向对象编程是其核心特性之一,使得Python成为了一种非常适合...
第二版的《Java面向对象程序设计》课件旨在深入浅出地介绍这一关键概念,帮助学习者掌握Java语言的基础以及面向对象编程的核心思想。下面将详细阐述Java面向对象编程的基本概念、特性及其在实际开发中的应用。 1. ...
封装是 Java 面向对象编程的三大特征之一,通过 Java 的类来实现数据和操作方法的封装,对外界可以将每一个 Java 类都视为一个黑箱,只需要调用该黑箱提供的方法即可完成你想要的操作。封装使得类中的成员变量和方法...
- **堆区**:动态分配的内存,如new操作符分配的内存。 - **栈区**:存储函数参数、局部变量等。 - **代码区**:存储程序的机器指令。 6. 访问控制: - C++提供private、protected和public三种访问控制级别,以...
面向对象编程基本概念 面向对象编程是现代软件开发的核心概念,第四章面向对象(上)ppt为我们详细介绍了面向对象编程的基本概念。 什么是抽象? 抽象是从被研究对象中舍弃个别的、非本质的、或与研究主旨无关的...
面向对象的思想起源于20世纪60年代的Simula67语言,而Smalltalk在80年代的出现推动了面向对象技术的普及。UML(统一建模语言)是90年代后期的重要成果,它为面向对象建模提供了一套标准化的语言,包括用例图、类图、...
面向对象实验——简单通讯录 C++ 语言设计 本实验报告旨在通过 C++ 语言实现一个简单的通讯录,应用面向对象程序设计的相关知识。实验报告将从三个方面展开:实验目的、实验内容和实验要求。 一、实验目的 通过本...
Java语言与面向对象程序设计是计算机科学领域中的一个重要主题,主要涵盖了Java编程语言的基本概念、语法特性以及如何利用面向对象的思想来构建复杂软件系统。在这个课程中,"印旻"和"王行言"可能作为授课专家,提供...