对象生成时会自动调用构造函数。只要找到了定义对象的地方,就找到了构造函数调用的时机。不同作用域的对象的生命周期不同,如局部对象、全局对象、静态对象等的生命周期各不相同,只要知道了对象的声明周期,便可以推断出构造函数的调用时机。
- 局部对象
反汇编:
获取对象首地址并调用构造函数:
对象的地址为:
进入构造函数,先是push一堆寄存器:
还原ecx寄存器,并初始化:
构造函数属于成员函数,在调用时要用到this指针。
如何识别?1、构造函数时这个对象在作用域内调用的第一个成员函数,根据this指针可以区分每个对象;2、返回this指针是构造函数的特征之一(这是识别局部变量构造函数的必要条件)。
- 堆对象
堆对象的识别重点在于识别堆空间的申请与使用。
举例:
new以及new的大小:
返回的地址:
调用构造函数:
先判断new是否从成功,如果失败就跳过构造函数:
执行构造函数初始化对象:
定位到对象的第一个成员变量,并赋值为0xb:
new对象返回对象的首地址时,也检查了是否为NULL,进行了一次判断,如果失败就跳过构造函数,所以可以从这一点入手,找到堆对象的构造函数。
考虑下我们这里有两个成员变量的情况:
new的大小变了:
给第二个成员变量赋值时的定位变了: