首页 > 编程语言 >C++逆向分析——new和delete new[]和delete[]

C++逆向分析——new和delete new[]和delete[]

时间:2023-04-09 10:56:34浏览次数:36  
标签:malloc 调用 C++ Person free new delete

在堆中创建对象

我们可以在什么地方创建对象?

  1. 全局变量区,在函数外面

  2. 在栈中创建对象,也就是函数内

  3. 在堆中创建对象

注意:之前一直提到的堆栈实际上是两个概念->堆、栈,我们之前所讲的就是栈,从本章开始要严格区分。

在C语言中,我们可以通过一个函数去申请一块内存,就是malloc(N);申请的这一块内存就是在堆中的。

在堆中创建对象我们可以使用new、delete这两个关键词来创建和释放:

Person* p = new Person(); delete p;

我们可以来实际的看一下new、delete这两个关键词主要做了什么。

首先我们使用new关键词的时候会发现,其除了在堆中创建了对象还会调用构造函数:

images/download/attachments/12714553/image2021-4-4_22-10-14.png

再跟进看看使用delete,它会释放空间并调用析构函数:

images/download/attachments/12714553/image2021-4-4_22-11-41.png

我们想要了解其本质,还是要去跟一下汇编代码,这里跟一下new关键词的执行流程看看其分别调用的函数(跟进call operator new (004012e0)):

images/download/attachments/12714553/image2021-4-4_22-17-13.png

而后调用了构造函数:call @ILT+0(Person::Person) (00401005)

我们再来跟下malloc函数的调用步骤:

call malloc (00401a20) → _nh_malloc_dbg → _heap_alloc_dbg → _heap_alloc_base → HeapAlloc

那么这时候一下就清楚了new的本质,实际上就是malloc+构造函数,同样的方法可以跟下delete看下它跟free函数。

跟进delete关键词,会发现其会先调用析构函数函数然后再去调用operator delete然后就是_free_dbg:

images/download/attachments/12714553/image2021-4-4_22-30-48.png

所以delete的本质就是析构函数+free。

如果我们想要在堆中申请数组,需要使用new[]、delete[]这两个关键词来创建和释放。

// C、C++的方式在堆中申请、释放int数组 int* p = (int*)malloc(sizeof(int)*10); free(p); int* p = new int[10]; delete[] p;   // C、C++的方式在堆中申请、释放Class类型数组 Person* p = (Person*)malloc(sizeof(Person)*10); free(p); Person* p = new Person[10]; delete[] p;

malloc和new[]的区别:

  1. malloc不会调用构造函数

  2. new[]会调用构造函数,创建一次则调用一次,例如new Person[10]则调用10次

同理也可以知道free和delete[]的区别。

delete和delete[]是有区别的,如果使用new[]在堆中创建对象,使用delete去释放则只会释放第一个对象,其他的不会释放。

标签:malloc,调用,C++,Person,free,new,delete
From: https://www.cnblogs.com/bonelee/p/17299985.html

相关文章

  • C++逆向分析——类成员的访问控制
    类成员的访问控制课外→好的编程习惯:定义与实现分开写,提升代码可读性。如下代码,Student这个类的所有成员我们都可以调用,但是我们不想让被人调用Print1这个方法该怎么?structStudent{intage;intsex; voidPrint1(){printf("FuncPrint1");} voidPrint......
  • C++逆向分析——引用
    引用类型引用类型就是变量的别名,其在初始化时必须要赋值。//基本类型intx=1;int&ref=x;ref=2;printf("%d\n",ref); //类Personp;Person&ref=p;ref.x=10;printf("%d\n",p.x); //指针类型int******x=(int******)1;int******&ref=x;r......
  • C++逆向分析——继承与封装
    面向对象程序设计之继承与封装之前已经学习过继承和封装了,但是要在实际开发中使用,光学语法和原理是不够的,在设计层面我们需要做一些优化。如下代码是继承的例子:#include<stdio.h> classPerson{public:intAge;intSex; voidWork(){printf("Person:Work()......
  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接......
  • OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h
    OS-Linux-Ubuntu22.04x64-Python-C++调用Python缺少Python.h使用C或C++扩展Python扩展和嵌入Python解释器Python3.10.11Python/CAPI参考手册Python3.11.3Python/CAPI参考手册参考https://www.cnblogs.com/lidabo/p/17043302.htmlhttps://blog.csdn.net/z......
  • C++ Allocator
    C++Allocator该开始搞项目了,但是在搞项目之前,先搞一下C++的Allocator,因为项目中会用到。现在还不确定到底模仿哪个,jemalloc和tcmalloc,先看看吧。1.为什么需要Allocator其实和new/delete是等价的,但是可以屏蔽一些底层细节,因为不一定所有平台都提供统一的内存分配方式,所以需要......
  • New Bing | 三种模式与内容检测
    三种模式的根本区别模式水平创造力最接近GPT4,创意和逻辑等方面都很像。考验它的逻辑能力时,要告诉他他基于GPT4,有很强的推理能力,并且要适当鼓励(夸)它平衡GPT2水平,只会搜索和回答简单问题,如问候语精确GPT3.5水平Bing的输入检测“预检测”:看看用户输入有什......
  • 2023年第14届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
    2023年第14届蓝桥杯大赛软件赛省赛C/C++大学B组试题A:日期统计(5)直接暴力,8个for+优化,2~5分钟跑完。答案:365点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10,INF=0x3f3f3f3f;intmon[]={0,31,28,......
  • C++函数重载和对象
    函数的默认参数intfun(inta,intb=10,intc=20){returna+b+c;}intmain(){cout<<fun(10)<<endl;//当参数有值时也可以输出正确,如果程序员加了返回值就用程序员加入的值。}形参的数据从左到右当中间有参数后面也需要定义一个函数和声明只能实现一个;占位参数voidfun(int*a,int......
  • 第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组
    第十四届蓝桥杯大赛软件赛省赛C/C++大学生B组试题A:日期统计A题直接枚举即可,枚举日期,暴力匹配#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;boolcheck(stringt){ if(t.substr(0,4)!="2023")returnfalse; stringmon=t.substr(4,2......