1.new和delete

程序的内存分为不同的区;

全局变量区中的变量在程序编译时决定,不需要管理内存;

局部变量一般存放在栈中,当用到时放入栈中,不用时栈中的地址处变成垃圾数据,也不需要管理;

而用malloc在堆中申请的内存在使用完后要调用free函数来释放;

1)关于malloc和free

malloc的函数调用链:

malloc ->_ nh_malloc_dbg ->_ heap_alloc_dbg ->_heap_alloc_base ->HeapAlloc

可以用反汇编追栈来分析:

HeapAlloc是kernel32.dll中导出的函数;

也可以直接调用该函数来申请堆内存,但是需要处理复杂的参数;

free的调用链:

free ->_ free_dbg ->_free_base ->HeapFree

free也是Kernel32.dll提供的;

2)关于new和delete

如果想在堆中分配内存,也可以使用new

例如:

int* a = new int;

new的调用链:

new ->_ nh_malloc ->_ nh_malloc_dbg ->_ heap_alloc_dbg ->_heap_alloc_base ->HeapAlloc

可以看到new和malloc一样,最终都是调用kernel32.dll的HeapAlloc函数;

new申请的堆空间需要释放,在c++中可以用关键字delete;

void main(){int* a = new int;delete a;getchar();
}

反汇编分析delete的函数调用链:

delete ->_free_dbg ->…

后面不用看了,和free完全一样;

3)new和delete的使用

1】new 关键字
int* pi = new int;
int* pk = new int(5);      //申请内存并赋初始值                          Person* ps = new Person;
Person* pd = new Person(1,2);    //申请内存并调用构造函数初始化

第一步: _ nh_malloc->_ nh_malloc_dbg->_ heap_alloc_dbg->_heap_alloc_base->HeapAlloc

第二步:调用构造函数

2】delete关键字
delete pi;
delete pk;

第一步:调用析构函数

第二步:_ free_dbg->_free_base->HeapFree

3】new[] 与 delete[]的用法.
int* pi = new int[10];  //在堆中申请10个int空间
delete[] pi;                                          Person* p = new Person[2];
delete[] p;           //要释放多个对象的内存,需要调用多次析构函数,因此[]不能漏,否则只会调用一次析构函数,可以在对象的析构函数中加printf来验证

New-delete相关推荐

  1. Reject: HTTP ‘DELETE‘ is not allowed, Not injecting HSTS.....DELETE请求PUT请求跨域问题

    CORS(DELETE请求.PUT请求) Reject: HTTP 'DELETE' is not allowed [DEBUG] 2021-08-25 15:23:52.401 [http-nio- ...

  2. Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)

    1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...

  3. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  4. C++:随笔6---new\delete\虚方法\抽象方法

    指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...

  5. C++中的new和delete用法

    //个体 point *p=new point; //point类存在初始化成员函数point(void)的前提下才能这样赋值: delete p;//一维数组,这样赋值的话,p在程序里表示的就不是指 ...

  6. LeetCode刷题记录3——237. Delete Node in a Linked List(easy)

    LeetCode刷题记录3--237. Delete Node in a Linked List(easy) 目录 LeetCode刷题记录3--237. Delete Node in a Linke ...

  7. 在析构函数中delete this指针问题

    思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...

  8. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化

    文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...

  9. leetcode 237: Delete Node in a Linked List

    题目: Write a function to delete a node (except the tail) in a singly linked list, given only access t ...

  10. 【C++】C/C++ 中default/delete特性

    C++类的特殊成员函数及default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org 目录 目录 C++类的特殊成员函数及def ...

最新文章

  1. 剑指offer 25: 二叉树中和为某一值的路径
  2. JVM运行时数据区域
  3. DataGridView 判断新增行:
  4. 深拷贝一个对象会了,怎么深拷贝一个图?
  5. 深入探讨this指针
  6. ping与telnet的区别
  7. 从无到有写一个运维APP(三)完结篇
  8. Executor源码解读
  9. vuejs路由插件:vue-router的工作原理
  10. mysql 准则 杂谈
  11. 怎样给Spark传递函数—怎样让你的Spark应用更高效更健壮
  12. 虚拟化架构下虚拟交换机和分布式虚拟交换机解析
  13. 安卓9开机 bootanimation.zip_小米手机如何从安卓10退回安卓9系统,不丢失传感器,不变砖...
  14. 互联网晚报 | 9月18日 星期六 | 微信发布外部链接内容管理规范调整声明;知乎宣布月活破亿;京东宣布双11节奏提前...
  15. 去年我国软件业收入4.3万亿元 同比增长16.6%
  16. phpnow升级mysql版本_phpnow1.5.6-1升级phpmyadmin,php及mysql版本
  17. nodejs websocket 并发调试笔记
  18. 教师考核成绩评定c语言程序,C语言课设--教师评价系统
  19. 小麦苗的微信公众号开通啦,欢迎大家扫码关注
  20. Modbus Slave学习笔记

热门文章

  1. oracle查询销量最高的前8本图书_8月份打捆机热销品牌揭晓,竞争形势扑朔迷离...
  2. 2022中国眼博会,山东青少年眼睛健康展,视力矫正与康复展
  3. MySQL打不开可能原因:MySQL服务未启动
  4. 【销售易】级联字段,类似于省市的关系
  5. CSDN的打码的年龄是咋算的?
  6. MATLAB灰色关联度分析
  7. IXWebHosting虚拟主机首页优先级设置方法
  8. Makefile教程整理:5,6
  9. Android系统开机启动流程
  10. android 调用ashx,手机知识:安卓手机如何打开.ashx文件