对象不使用默认析构函数

class Test
{
public:
char cNum1;
int iNum2;
int* pInt;
}; Test _ReturnObject()
{
Test stLocalObject;
stLocalObject.cNum1 = 0;
stLocalObject.iNum2 = 1; stLocalObject.pInt = new int;
*stLocalObject.pInt = 0x55;
return stLocalObject;
} int main(int argc, char* argv[])
{
Test stObject;
stObject = _ReturnObject(); return 0;
}

分析以上代码的反汇编代码,发现编译器并没有调用析构函数。其会将_ReturnObject()函数内的局部对象先保存到main函数的栈空间中(实际是在函数内部调用了拷贝构造函数,进行了对象的复制),返回值eax为其首地址,接着会将保存在此处的对象复制到另一处栈空间中,接着利用此栈空间对接收返回对象的实际对象赋值。



我们产生疑问!既然eax地址处和从eax复制的另一处栈地址处都保存着返回对象的数据,是否两处地址都可以认为是实际的对象。如果其是实际的对象那么其一定会再生命周期快结束时调用析构函数,因为这里编译器没有调用默认的析构函数所以我们无法判断,我们下面需要自己指定析构函数来分析。

对象使用析构函数

我们在上述代码的基础上加上自己的析构函数,此析构函数会将对象动态申请的内存释放掉。

~Test()
{
if(pInt != NULL)
delete pInt;
}

我们查看其对应的汇编代码,发现其在对象返回的过程中将对象保存到eax地址后,直接将eax地址对应的对象保存到stObject中,当然这两处的对象也会分别调用析构函数。此eax地址对应的对象被称为临时对象,临时对象的生命周期仅限当前语句,因此当执行完stObject = _ReturnObject();语句后临时对象就会调用析构函数。(我们可以看到在一开始其就会为临时对象在栈中申请内存空间,接着让临时对象的地址作为参数入栈从而在_ReturnObject函数内部对临时对象进行复制)



值得注意的是我们这里的代码是会报错的,因为返回对象在_ReturnObject函数结束时就会调用析构函数将int* pInt对应的内存给撤销了,当eax地址对应的临时对象在调用析构函数是就会报错。(因为我们没有定义拷贝构造函数,所以其在复制对象时使用默认的浅拷贝构造函数)要想避免这样的错误我们需要自己定义拷贝构造函数(深拷贝)。

临时对象

临时对象存在是为了可以使代码编写者像这样_ReturnObject().cNum1在返回对象后直接使用相关数据成员。

不使用临时对象

如果我们用此形式 Test stObject = _ReturnObject(); 直接调用返回对象的函数则会以定义的实际对象的地址为参数而不是以临时对象的地址为参数,从而不使用临时对象。

使用拷贝构造函数

Test(Test& Object)
{
cNum1 = Object.cNum1;
iNum2 = Object.iNum2;
pInt = Object.pInt; }

我们来给类加上我们的拷贝构造函数,我们发现在_ReturnObject函数结束前会利用调用拷贝构造函数实现将返回对象保存到临时对象下(对象的复制),从而实现“返回对象”。

浅拷贝和深拷贝

浅拷贝和深拷贝主要是针对C++类中存在指针型数据成员而言的。浅拷贝就是单纯的进行成员值的复制,而深拷贝是对指针型变量所指向的内存重新申请新的内存,并将内存中的数据复制过去。上面我们所给出的拷贝构造函数就是一个典型的浅拷贝(默认拷贝构造函数也是浅拷贝)。

c++逆向分析----返回对象的更多相关文章

  1. HQL查询——查询返回对象类型分析

    关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...

  2. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  3. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  4. Android逆向分析(2) APK的打包与安装

    http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Ap ...

  5. [Android Security] Smali和逆向分析

    copy : https://blog.csdn.net/u012573920/article/details/44034397 1.Smali简介 Smali是Dalvik的寄存器语言,它与Java ...

  6. RE-1 逆向分析基础

    逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...

  7. 《C++反汇编与逆向分析技术揭秘》--认识启动函数,找到用户入口

    <C++反汇编与逆向分析>和<程序员的自我修养>都是以VC6的代码作为例子讲解的.这里是在vs2017下,CRT代码有些区别,但整体流程上都是初始化环境,设置参数,最后转到用户 ...

  8. 病毒木马查杀实战第012篇:QQ盗号木马之逆向分析

    前言 在本系列的文章中,对每一个病毒分析的最后一个部分,若无特殊情况,我都会采用逆向分析的手段来为读者彻底剖析目标病毒.但是之前的"熊猫烧香"病毒,我用了三篇文章的篇幅(每篇250 ...

  9. 【C++】从零开始的CS:GO逆向分析3——写出一个透视

    [C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...

随机推荐

  1. 归并排序(JAVA语言)

    public class merge { public static void main(String[] args) { // TODO Auto-generated method stub int ...

  2. 前端-CS-04

    一:DOM(文档对象模型) document 简写DOM 1.DOM中定义变量用 var  如下截图中:定义demo变量 2.取一个input输入框中的值的方法: 1)先如1中,在dom中顶一个一个变 ...

  3. [状压DP]车II

    车 I I 车II 车II 题目描述 有一个 n ∗ m n*m n∗m的棋盘 ( n . m ≤ 80 , n ∗ m ≤ 80 ) (n.m≤80,n*m≤80) (n.m≤80,n∗m≤80)要 ...

  4. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  5. springboot项目整合druid数据库连接池

    Druid连接池是阿里巴巴开源的数据库连接池项目,后来贡献给Apache开源: Druid的作用是负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个: D ...

  6. JMeter自定义采样器插件开发

    JMeter自定义采样器插件开发 目录 JMeter自定义采样器插件开发 1. 简介 2. 需求简介 3.成品展示 成功展示 失败展示 4. 准备开发环境 4.1 准备pom文件 4.2 新建Java ...

  7. 磁盘挖矿时代开启——GitHub 热点速览 v.21.16

    作者:HelloGitHub-小鱼干 本周的 GitHub 热点非常经常,因为一贫如洗的小鱼干突然发现了发家致富之道:磁盘挖矿.chia-blockchain 是一个将磁盘作为计算资源的项目,简而言之 ...

  8. Day11_58_增强for循环

    增强for循环 * 语法 : for(数据类型 变量名:数组名/集合名) * 集合如果要使用增强for循环需要先使用泛型来确定元素类型,如果没有使用泛型就使用foreach,那么变量类型设置为Obje ...

  9. JMeter 实战案例

    案例1:博客网站后端测试 案例2:JPetStore 应用 案例1:博客网站后端测试 测试目标 测试博客网站后端的常用 HTTP 接口的访问方法. 展示 HTTP 请求的各类使用方法. 展示提取 JS ...

  10. N 皇后-力扣解题

    n 皇后问题 研究的是如何将 n 个皇后放置在 n*n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案. 每一种解法包含一个不同的 n 皇后问 ...