当前位置: 首页 > news >正文

内存管理(1)

内存管理(1)

  • 1、各类型数据在内存中的存储空间
  • 2、C++内存管理方式
    • 2.1 针对于内置类型分析
    • 2.2 针对于自定义类型分析
    • 2.3 C语言与C++在申请动态内存失败时的区别
  • 3、operator new 和 operator delete函数(重点)
    • 3.1 底层知识解析
    • 3.2 实现专属operator new 与 operator delete (了解)

1、各类型数据在内存中的存储空间

int globalVar = 1;
static int staticGlobalVar = 1;void Test()
{static int staticVar = 1;int localVar = 1;int num1[10] = {1,2,3,4};char char2[] = "abcd";  //常量数据需要在外面加 " "const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int)*4);int* ptr2 = (int*)calloc(4,sizeof(int));int* ptr3 = (int*)realloc(ptr2,sizeof(int)*4);free(ptr1);free(ptr2);
}//(1) globalVar  数据段 ;                         staticGlobalVar  数据段;    staticVar 数据段;
//    localVar   栈区   ;                         num1   栈区
//    char2(数组名\数组首元素地址)  栈区;       *char2  代码段
//    pChar3(指针) 栈区;                        *pChar3  代码段
//    ptr1(指针)   栈区;                        *ptr1   堆区
//

2、C++内存管理方式

// C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete
// 操作符进行动态内存管理。

2.1 针对于内置类型分析

void Test()
{int* p1 = (int*)malloc(sizeof(int));int* p2 = new int;//申请具有5个int的数组int* p3 = new int[5];//申请1个int的数组,并初始化为5int* p4 = new int(5);//C++11支持new[] 用{}初始化  C++98不支持//将申请具有5个int的数组 进行初始化int* p5 = new int[5]{1,2,3};free(p1);delete p2;delete[] p3;delete p4;delete[] p5;//针对内置类型,new/delete 跟 malloc/free没有本质的区别,只有用法的区别。// new/delete 用法简化了。
}int main()
{Test();return 0;
}

2.2 针对于自定义类型分析

class A
{
public:A(int a):_a(a){cout<<"A():"<< this << endl;}~A(){cout<< "~A():" <<this << endl;}private:int _a;
};int main()
{//堆上申请空间A* p1=(A*)malloc(sizeof(A));if (0==p1){perror("malloc fail");return 0;}//1、堆上申请空间  2、调用构造函数进行初始化A* p2 = new A;   //调用默认构造函数A* p2 = new A(10); //调用非默认构造函数//申请10个A类型对象的空间,并进行初始化A* p3 = new A[5]{1,2,3,4,5};delete[] p3;  //数组里的对象,先初始化后析构//释放空间free(p1);//1、调用 析构函数 清理对象中资源  2、释放空间delete p2;//结论: new/delete 是为自定义类型准备的;//不仅在堆上申请出来,还会调用构造函数和析构函数进行初始化和清理。//注意:new/delete  new[]/delete[]一定要匹配使用,否则可能会出问题。return 0;
}

2.3 C语言与C++在申请动态内存失败时的区别

int main()
{// malloc失败返回NULLchar* p1 = (char*)malloc(1024u * 1024u * 1024u * 2 - 1);printf("%p\n",p1);// new失败,不需要检查返回值,它失败是抛异常(异常:是面向对象语言出错处理的方式)try{//char* p2 = new char[1024u * 1024u * 1024u*2-1];char* p2 = (char*)operator new(1024u * 1024u * 1024u);printf("%p\n", p2);operator delete(p2);}//当申请空间失败时,才会进入catch; 若申请空间成功时,就会跳过catch;catch (const exception& e){cout<< e.what() <<endl;}return 0;
}

3、operator new 和 operator delete函数(重点)

3.1 底层知识解析

// new和delete 是用户进行动态内存申请和释放的操作符。operator new 和 operator delete是系统提供的全局函数,new在底层调用operator new全局函数来
// 申请空间,delete在底层通过operator delete全局函数来释放空间。
//
// operator new全局函数——帮助new开空间——(封装)调用malloc{ 若malloc失败了,符合C++ new的失败机制(失败抛异常)}。 
// operator delete全局函数——帮助delete释放空间——(封装)调用free 
//
// new的底层分为两部分:调用operator new +  调用构造函数; 即:new Type(自定义类型) --> call  operator new【调用malloc(若开辟空间失败,会抛异常)】 +  call Type构造函数
// delete的底层也分为两部分:调用operator delete + 调用析构函数;
//
//总结:在C++中,申请和释放堆上的空间,就用new 和 delete

3.2 实现专属operator new 与 operator delete (了解)

//注意:一般情况下不需要对 operator new 和 operator delete 进行重载,除非在申请和释放空间的时候具有某些特殊的要求。比如:在使用new和delete
// 申请和释放空间时,打印一些日志信息,来简单帮助用户检测是否存在内存泄漏。
//
//当我们不写自己专属的operator new函数和 operator delete函数的时候,new和delete 会自动调用C++库里面的operator new函数和 operator delete函数。
//当我们自己写专属的operator new函数和 operator delete函数时,new和delete 会调用专属的operator new函数和 operator delete函数来实现某些特殊的需求。// new -> operator new + 构造函数
// 默认情况下,operator new使用全局库里面的。
// 但每个类可以去实现自己专属operator new;  new这个类对象,它就会调用自己实现的这个operator new//实现类专属的operator new(优先调用)
struct ListNode
{int _val;ListNode* _next;//内存池static allocator<ListNode> alloc;void* operator new(size_t n){cout<< "operator new -> STL内存池allocator申请" << endl;void* obj = alloc.allocate(1);return obj;}void operator delete(void* ptr){cout<< "operator delete -> STL内存池allocator申请" << endl;alloc.deallocate((ListNode*)ptr,1);}//构造函数struct ListNode(int val):_val(val),_next(nullptr){}
};内存池的定义
allocator<ListNode> ListNode::alloc;int main()
{//频繁地申请 ListNode;想提高效率 —— 申请ListNode时,不去malloc,而是自己定制内存池。ListNode* node1 = new ListNode(1); //new先去调用 类里面的operator new ,如果类里面没有operator new,就会去库里面调用。ListNode* node2 = new ListNode(2);ListNode* node3 = new ListNode(3);delete node1;delete node2;delete node3;return 0;
}

相关文章:

内存管理(1)

内存管理&#xff08;1&#xff09; 1、各类型数据在内存中的存储空间2、C内存管理方式2.1 针对于内置类型分析2.2 针对于自定义类型分析2.3 C语言与C在申请动态内存失败时的区别 3、operator new 和 operator delete函数&#xff08;重点&#xff09;3.1 底层知识解析3.2 实现…...

实践教程|基于 pytorch 实现模型剪枝

PyTorch剪枝方法详解&#xff0c;附详细代码。 一&#xff0c;剪枝分类 1.1&#xff0c;非结构化剪枝 1.2&#xff0c;结构化剪枝 1.3&#xff0c;本地与全局修剪 二&#xff0c;PyTorch 的剪枝 2.1&#xff0c;pytorch 剪枝工作原理 2.2&#xff0c;局部剪枝 2.3&#…...

[Docker精进篇] Docker镜像构建和实践 (三)

前言&#xff1a; Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中&#xff0c;以便在不同环境中快速、可靠地部署和运行应用程序。 文章目录 Docker镜像构建1️⃣是什么&#xff1f;2️⃣为什么&#xff1f;3️⃣镜像构建一、用现有容器构建新镜像…...

【Unity细节】Unity中的层级LayerMask

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…...

修改el-table行悬停状态的背景颜色

.content:deep().el-table tr:hover>td {background-color: #f5f5f5 !important; /* 设置悬停时的背景颜色 */ }/*这一点很重要&#xff0c;否则可能会导致hover行时操作列还是原来的背景色*/ .content:deep().el-table__body tr.hover-row>td{background-color: #f5f5f5…...

记一次mysql not in的使用问题

现象&#xff1a;使用not in 某个id集合&#xff0c;出现脏数据&#xff0c;存在null数据。例如&#xff1a;not in(1,2,null)&#xff0c;结果会一条数据都没有&#xff0c;为空 原因&#xff1a; 当使用NOT IN操作符时&#xff0c;传递给它的值列表中不能包含NULL值&#xf…...

JavaFx基础学习【四】:UI控件的通用属性

目录 前言 一、介绍 二、继承关系 三、常用通用属性 四、属性Properties 五、属性绑定 六、属性监听 七、事件驱动 八、其他章节 前言 如果你还没有看过前面的文章&#xff0c;可以通过以下链接快速前往学习&#xff1a; JavaFx基础学习【一】&#xff1a;基本认识_明…...

【Leetcode】101.对称二叉树

一、题目 1、题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例1: 输入:root = [1,2,2,3,4,4,3] 输出:true示例2: 输入:root = [1,2,2,null,3,null,3] 输出:false提示: 树中节点数目在范围 [1, 1000] 内-100 <= Node.val <= 100进阶:你可以…...

用Java实现原神抽卡算法

哈喽~大家好&#xff0c;好久没有更新了&#xff0c;也确实遇到了很多事&#xff0c;这篇开始恢复更新&#xff0c;喜欢的话&#xff0c;可以给个的三连&#xff0c;什么&#xff1f;你要白嫖&#xff1f;那可以给个免费的赞麻。 &#x1f947;个人主页&#xff1a;个人主页​​…...

微服务—Eureka注册中心

eureka相当于是一个公司的管理人事HR,各部门之间如果有合作时&#xff0c;由HR进行人员的分配以及调度&#xff0c;具体选哪个人&#xff0c;全凭HR的心情&#xff0c;如果你这个部门存在没有意义&#xff0c;直接把你这个部门撤销&#xff0c;全体人员裁掉&#xff0c;所以不想…...

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…...

Mybatis动态SQL,标签大全

动态SQL常用场景 批量删除delete from t_car where id in(1,2,3,4,5,6,......这里的值是动态的&#xff0c;根据用户选择的 id不同&#xff0c;值是不同的);多条件查询哪些字段会作为查询条件是不确定的&#xff0c;根据用户而定 select * from 1 t_car where brand like 丰田…...

zotero在不同系统的安装(win/linux)

1 window系统安装 zotero 官网&#xff1a; https://www.zotero.org/ 官方文档 &#xff1a;https://www.zotero.org/support/ (官方)推荐常用的插件: https://www.zotero.org/support/plugins 入门视频推荐&#xff1a; Zotero 文献管理与知识整理最佳实践 点击 exe文件自…...

web会话跟踪以及JWT响应拦截机制

目录 JWT 会话跟踪 token 响应拦截器 http是无状态的&#xff0c;登录成功后&#xff0c;客户端就与服务器断开连接&#xff0c;之后再向后端发送请求时&#xff0c;后端需要知道前端是哪个用户在进行操作。 JWT Json web token (JWT), 是为了在网络应用环境间传递声明而…...

Web菜鸟入门教程 - Swagger实现自动生成文档

如果是一个人把啥都开发了&#xff0c;那用不到Swagger-UI&#xff0c;但一般情况是前后端分离的&#xff0c;所以就需要告诉前端开发人员都有哪些接口&#xff0c;传入什么参数&#xff0c;怎么调用&#xff0c;返回什么。有了Swagger-UI就能把这部分文档编写的业务给省去了。…...

2023国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…...

第7章:贝叶斯分类器

贝叶斯决策论 贝叶斯分类器&#xff1a;使用贝叶斯公式 贝叶斯学习&#xff1a;使用分布估计&#xff08;不同于频率主义的点估计&#xff09; 极大似然估计 朴素贝叶斯分类 半朴素贝叶斯 条件独立性假设&#xff0c;在现实生活中往往很难成立。 半朴素贝叶 斯的一个常用策略…...

【LeetCode】88.合并两个有序数组

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并…...

05 - 研究 .git 目录

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git对象一共有三种&#xff1a;数据对象 blob、树对象 tree以及提交对象 commit&#xff0c;这些对象都被保…...

MySQL之索引和事务

索引什么是索引索引怎么用索引的原理 事务使用事务事务特性MySQL隔离级别 索引 什么是索引 索引包含数据表所有记录的引用指针&#xff1b;你可以对某一列或者多列创建索引和指定不同的类型&#xff08;唯一索引、主键索引、普通索引等不同类型&#xff1b;他们底层实现也是不…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...