New-delete
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相关推荐
- 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- ...
- Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)
1. git remote add--添加远程仓库 在GitHub 上创建的仓库路径为 "git@github.com:用户名/git-tutorial.git".现在我们用git ...
- C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)
1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...
- C++:随笔6---new\delete\虚方法\抽象方法
指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...
- C++中的new和delete用法
//个体 point *p=new point; //point类存在初始化成员函数point(void)的前提下才能这样赋值: delete p;//一维数组,这样赋值的话,p在程序里表示的就不是指 ...
- 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 ...
- 在析构函数中delete this指针问题
思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include <iostream> using namespace std; class A{ pub ...
- LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
文章目录 前言 1. 问题背景 2. 问题复现 3. Rocksdb 的 Delete-Aware 优化 3.1 可配置的 Delete-Aware调度 3.2 Compaction 逻辑对 dele ...
- 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 ...
- 【C++】C/C++ 中default/delete特性
C++类的特殊成员函数及default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https://www.geeksforgeeks.org 目录 目录 C++类的特殊成员函数及def ...
最新文章
- 剑指offer 25: 二叉树中和为某一值的路径
- JVM运行时数据区域
- DataGridView 判断新增行:
- 深拷贝一个对象会了,怎么深拷贝一个图?
- 深入探讨this指针
- ping与telnet的区别
- 从无到有写一个运维APP(三)完结篇
- Executor源码解读
- vuejs路由插件:vue-router的工作原理
- mysql 准则 杂谈
- 怎样给Spark传递函数—怎样让你的Spark应用更高效更健壮
- 虚拟化架构下虚拟交换机和分布式虚拟交换机解析
- 安卓9开机 bootanimation.zip_小米手机如何从安卓10退回安卓9系统,不丢失传感器,不变砖...
- 互联网晚报 | 9月18日 星期六 | 微信发布外部链接内容管理规范调整声明;知乎宣布月活破亿;京东宣布双11节奏提前...
- 去年我国软件业收入4.3万亿元 同比增长16.6%
- phpnow升级mysql版本_phpnow1.5.6-1升级phpmyadmin,php及mysql版本
- nodejs websocket 并发调试笔记
- 教师考核成绩评定c语言程序,C语言课设--教师评价系统
- 小麦苗的微信公众号开通啦,欢迎大家扫码关注
- Modbus Slave学习笔记