内存管理(C++版)

news2024/9/20 1:22:47

C/C++内存分布

程序经过编译生成可执行的二进制程序,我们可以把虚拟进程地址分为以下四个空间:栈,堆,常量区,静态区。这四个区里面存贮的也是不一样的内容。

各个区域所存储内容的说明

  • 栈/堆栈:用于建立函数栈帧,主要存储一些临时变量,如(非静态局部变量/函数参数/返回值等等),栈空间很小,在Linux中大概是8M。栈是向下增长的。
  • 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。
  • 堆:用于程序运行时动态内存分配,堆是可以上增长的。栈空间很大,在Linux中大概是以G为单位。
  • 静态区/数据段:存储全局数据和静态数据。
  • 常量区/代码段:可执行的代码/只读常量。

下面通过面试体案例进行讲解各部分所在的位置

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(ptr3);

}

1. 选择题:   选项: A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)  

globalVar在哪里?__C__    

staticGlobalVar在哪里?_C___  

staticVar在哪里?_C___    

localVar在哪里?_A___  

num1 在哪里?___A_    

char2在哪里?_A___    

*char2在哪里?__A_  

pChar3在哪里?__A__        

*pChar3在哪里?__D__  

ptr1在哪里?__A__          

*ptr1在哪里?__B__

 解析:

nums1是一个数组,存放在栈区,char2也是一个数组,它是在常量区有一串字符串,字符串拷贝到char2数组中,pChar3是一个指针,指针存的是常量字符串首元素的地址,这里*pChar3就是在常量里面了,ptr1开辟的是指向堆区的空间,因此*ptr指向的是堆区。

 动态管理方式

C语言中malloc/calloc/realloc/frees用法

malloc:void * malloc (size_t size);

  • 申请一块大小为 size 的内存空间,申请成功,返回指向这块空间起始位置的指针
  • 新分配的内存块没有初始化,保留不确定的值
  • 如果函数无法分配申请的内存块,会返回一个空指针(NULL),因此 malloc 函数的返回值一定要检查
  • 此函数只负责申请 size 大小的内存空间,并不知道未来会存放什么类型的数据,因此函数的返回值是 void*

calloc:void* calloc (size_t num, size_t size);

  • 函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为 0 

realloc:void* realloc (void* ptr, size_t size);

  • 函数的出现让动态内存管理更加灵活,能够合理的使用内存,对内存的大小做灵活的调整。realloc 函数就可以做到对动态开辟内存大小的调整

C++中使用的有new后面只有跟着申请的类型,在初始化的时候new 类型后面要加上(初始化的值),在申请多个的情况就是new 类型后面要加上[],申请多个并进行初始化的时候在[]后面加上{}初始化{}不赋值就是默认值,因此构造函数一点要有一个默认值以便使用。delete删除时用delete+删除的变量名就行,删除多个时候就是delete 变量名+[]。

void Test()

{  

        // 动态申请一个int类型的空间  

        int* ptr4 = new int;    

        // 动态申请一个int类型的空间并初始化为10  

        int* ptr5 = new int(10);  

         // 动态申请3个int类型的空间  

        int* ptr6 = new int[3];  

        

         // 动态申请3个int类型的空间 并进行初始化 

        int* ptr6 = new int[3]{1,2,3};  

        delete ptr4;  

        delete ptr5;  

        delete[] ptr6;

}

 C++中new delete相对与malloc free的优点

C++中的new不仅具可以开辟空间,还会进行函数的构造,delete相对与free不仅可以释放空间还会调用析构函数。

C++中new delete的用法

class A
{
public:
 A(int a = 1)
 : _a(a)
 {
 cout << "A():" << this << endl;
 }
 ~A()
 {
 cout << "~A():" << this << endl;
 }
private:。
 int _a;
};
int main()
{
 
 A* p1 = (A*)malloc(sizeof(A));
 A* p2 = new A(1);
 free(p1);
 delete p2;

 int* p3 = (int*)malloc(sizeof(int)); 
 int* p4 = new int;

 free(p3);
 delete p4;

 A* p5 = (A*)malloc(sizeof(A)*10);
//前三个初始化1,2,3后面的就是默认值
 A* p6 = new A[10]{1,2,3};

 free(p5);
 delete[] p6;

 return 0;
}

new与delete的底层原理 

operator new与operator delete是库函数,不是函数的重载。operator new是对malloc的封装而operator delete是对free_dbg函数的封装(这里可以理解为是对free函数的封装)。new和delete关键字是对operator new与operator delete的调用。

下图是通过反汇编来更好的理解new的底层:

new A[N]的原理

  • 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请
  •  在申请的空间上执行N次构造函数

delete[N]的原理

  • 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 
  • 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释 放空间

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++—string类接口与用法大总结(其中涉及STL基础)

目录 1.string类的本质 2.string类的构造 1.普通构造 2.功能型构造 1.拷贝构造功能型 2.带参构造功能型 3.其余构造 3.operator[] 4.迭代器&#xff08;iterator&#xff09; 1.概念 2.改变string对象本身 3.正向迭代器&#xff08;iterator&#xff09; 4.反向迭代…

基于springboot的驾校预约管理系统的设计与实现 (含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的驾校预约管理系统5拥有三种角色&#xff1a;管理员、教练、学员 管理员&#xff1a;学员管理、教练管理、车辆管理、车辆关联、维修管理等 教练&#xff1a;学员查看/毕…

通过Python代码发送量化交易信号邮件通知

量化交易利用数学模型和计算机算法来分析市场数据,并生成交易信号,本文将介绍如何使用Python编写一个简单的脚本,通过发送邮件通知量化交易信号。 开启SMTP服务 首先要在发件箱的邮件设置中,将POP3/SMPT服务开启,记录下授权密码,在本地可通过此密码登录,注意有效期和保…

总结拓展十:SAP开发计划(下)

第一节 接口功能开发说明书设计 1、软件系统接口作用 答&#xff1a;系统接口&#xff0c;是实现系统间数据传输的功能。 2、软件系统接口特点 1&#xff09;采用Web Service技术作为平台&#xff0c;有众多的数据传输协议标准&#xff0c;通过API与外界交流数据。 2&…

向上转移和向下转型

向上转型 实际就是创建一个子类对象&#xff0c;将其当成父类对象来使用。格式&#xff1a;父类类型 对象名new 子类类型&#xff08;&#xff09;&#xff1b;eg&#xff1a;Animal animalnew Cat&#xff08;&#xff09;&#xff1b;animal是父类类型&#xff0c;但可以引用…

超详细超实用!!!零基础java开发之云风笔记接口开发之查询单条笔记详细信息(十二)

云风网 云风笔记 云风知识库 一、service/NoteApi新增getNodeDetail接口定义 public interface NoteApi {...NoteManage getNoteDetail(int id); }二、service/impl/NoteServiceImpl接口实现逻辑 public class NoteServiceImpl implements NoteApi {AutowiredNoteMapper not…

产品经理入门攻略:如何从零开始成为产品经理

“人人都是产品经理”这句话相信你一定听过。 作为现在的热门职业&#xff0c;许多朋友也在心里埋下了一颗想要成为产品经理的种子。 产品经理的工作其实没有传说中的那么“高大上”&#xff0c;甚至可以说大多数时候是枯燥且无聊的&#xff0c;需要不断地对数据进行分析&…

如何在ONLYOFFICE文档中,将新插件添加为选项卡

随着 ONLYOFFICE 文档8.1版本的推出&#xff0c;我们引入了各式各样的功能&#xff0c;旨在增强软件功能性和优化用户体验。其中一项改进是&#xff0c;插件可以显示在一个独立的选项卡中了。在本博客文章中&#xff0c;我们将带您了解充分利用这一新功能的各项步骤。 关于 ONL…

图像修复(Inpainting)技术的前沿模型与数据集资源汇总

图像修复&#xff08;Image Inpainting&#xff09;是一种计算机视觉技术&#xff0c;旨在填补图像中的缺失区域或去除图像中的不需要部分&#xff0c;使其看起来自然且无明显痕迹。其目标是根据图像的上下文信息和周围像素来推断和重建缺失区域的内容&#xff0c;以生成逼真且…

实战17-NavBar+Vip布局

NavBar.ets import { PADDING } from ../../constants/size import rvp from ../../utils/resposive/rvIndexComponent export default struct NavBar {StorageProp(topHeight) topHeight: number 0;build() {Row() {Row({ space: rvp(6) }) {Text(请选择地址).fontSize(rvp(1…

Java基础笔记1】Java基础语法

目录 一、Java简介 二、JDK和Java初体验 三、配置环境变量 四、IDEA快捷键 五、Java语法基础 1. 注释 2. 字面量 3. 变量 4. 关键字和标识符 5. 变量详解 a. 数值数据在计算机中的存储​编辑 b. 文本、图片、音频等数据在计算机中的存储 c. 八进制和十六进制 6. 数据类型 a. …

【LabVIEW】事件结构的用法

本篇文章记录我学习LabVIEW的事件结构用法&#xff0c;希望我的分享对你有所帮助&#xff01; 目录 一、案例说明 1、 LabVIEW实现“YAXBXC的计算” 2、添加事件结构 一、案例说明 在LabVIEW实现“YAXBXC的计算”的基础上&#xff0c;加上事件结构&#xff0c;实现单击一次按…

【读书笔记-《30天自制操作系统》-22】Day23

本篇内容比较简单&#xff0c;集中于显示问题。首先编写了应用程序使用的api_malloc&#xff0c;然后实现了在窗口中画点与画线的API与应用程序。有了窗口显示&#xff0c;还要实现关闭窗口的功能&#xff0c;于是在键盘输入API的基础上实现了按下按键关闭窗口。最后发现用上文…

初学者笔记本电脑玩转大模型系列二:微调谷歌Gemma模型

之前分享了《初学者笔记本电脑玩转大模型系列一&#xff1a;利用ollama跑大模型》&#xff0c;这不&#xff0c;Google发布了Gemma开放模型&#xff0c;同等参数尺寸性能最好的大模型&#xff0c;那么言归正传&#xff0c;如何在笔记本电脑微调Gemma模型呢&#xff1f;我们接下…

阿里云CTO:通义稳居全球最强开源大模型,性能接近GPT-4o

来源&#xff1a;首席数智官 9月19日&#xff0c;在2024杭州云栖大会上&#xff0c;阿里云CTO周靖人表示&#xff0c;阿里云正在围绕AI时代&#xff0c;树立一个AI基础设施的新标准&#xff0c;全面升级从服务器到计算、存储、网络、数据处理、模型训练和推理平台的技术架构体…

Temu应用全球下载量突破7.35亿次!美国占27%,还是主要市场

据了解&#xff0c;随着购物者更多选择Temu作为实惠的在线购物目的地&#xff0c;其月访问量在今年第一季度跃升至5亿次以上&#xff0c;应用下载量也大幅增加。据外媒报道&#xff0c;根据Stocklytics的最新数据&#xff0c;Temu应用程序截至目前的下载量已超过7.35亿次。 最新…

动态线程池(二)

动态线程池 环境搭建 启动Nacos和redis 安装Node-Exporter 安装Prometheus 安装Grafana 源码解析

鸢尾花书实践和知识记录[数学要素3-2乘除]

书的作者 文章目录 算术乘除&#xff1a;先乘除&#xff0c;后加减&#xff0c;括号内先算基本的乘法运算计算阶乘基本除法 向量的乘法&#xff1a;标量乘法&#xff0c;向量内积&#xff0c;逐项积标量乘法向量的内积对于inner和dot的实现方式的探究逐项积dot的计算过程 逐项…

MAC如何获取文件数字签名和进程名称

1、安装需要查看数字签名和进程名称的软件包 2、打开终端命令行(Terminal) 3、查找数字签名 在终端命令行中输入: codesign -dvv 安装的软件路径 2>&1 | grep "Authority=" | head -n 1 | cut -d = -f2”

PDF使用虚拟列表技术做渲染和加载带来的问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…