C / C++的内存管理

news2024/9/21 16:33:01

前言

Hello,我又回来了,今天我们将继续学习C++部分,今天我们将承接前面的知识,继续学习C++的内存管理,今天的内容较为重要,所以我们废话不多说,我们还是按例三连上车,开始我们今天内容!

 1.c/c++的内存分布

我们先不要着急的来讲理解那些较为复杂的概念,我们先来看看下面的代码:

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。栈又叫堆栈--非静态局部变量/函数参数/返回值,栈是向下增长的。

2.内存映射高效的I/O映射方式,用于装在一个高效的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

3.堆用于程序运行时的动态内存分配,堆是可以是可以向上增长的。

4.数据段--存储全局变量和静态变量。

5.代码段--可执行的代码/只读常量。

2.c/c++的动态内存管理方式

2.1C语言的动态内存管理方式

void Test ()
{
// 1.malloc/calloc/realloc的区别是什么?
int* p2 = (int*)calloc(4, sizeof (int));
int* p3 = (int*)realloc(p2, sizeof(int)*10);
// 这里需要free(p2)吗?
free(p3 );
}

大家还记不记得前面我们在学习C语言时学习的动态内存分配管理函数呢?

这里有一道面试题:请说出 malloc/ calloc /realloc三个函数的区别

这是我们曾经学过的内容,这里我就不在赘述,不太清楚地小伙伴可以去看看这篇文章哟: C语言——动态内存管理_c语言的动态内存管理-CSDN博客

2.2C++的动态内存管理方式 

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

void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请3个int类型的空间
int* ptr6 = new int[3];
delete ptr4;
delete ptr5;
delete[] ptr6;
}

 注意:在申请自定义类型的空间时,new会主动调用构造函数,delete会自动调用析构函数。而malloc与free不会有这样的操作!

 3.new 和 delete的实现原理

3.1内置类型 

如果申请的内置类型的空间,new·和malloc,delete和free的操作基本类似,不同的是:

 new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续的空间,而且new申请空间失败时会抛出异常,malloc会直接返回NULL;

3.1自定义类型

  • new的原理 

1.调用operator new来申请空间

2.在申请的空间上执行构造函数,完成对象的构造

  • delete的原理

1.在空间上执行析构函数,完成对象的资源清理

2.调用operator delete清理空间

  • newT[N]的原理

1.使用operator new[]函数,在operator new[]中调用operator new函数完成N个对象空间的申请

2.在申请空间上执行N次构造函数。

  • delete[]的原理

在释放的空间上执行N次析构函数,完成N个对象的空间清理:、

2.调用operator delete[]释放空间,实际上operator delete[]中调用operator delete来释放空间

4.malloc/free和new/delete

malloc/free和new/delete的共同点是:都从堆上申请空间,并且需要进行手动的释放,不同和的方法是:

  • 1.malloc函数和free是函数,而new和delete是操作符!
  • 2.malloc申请的空间不会进行初始化,new可以进行初始化
  • 3.malloc申请空间时需要手动计算空间的大小,new后面只需要跟上申请空间的类型就可以了,如果有多个的对象需要被申请,在[]中指定对象的个数就可以了。
  • 4.malloc的返回类型是(void*),在使用的时候必须进行强制转化,而new不需要,因为new后面跟的就是空间的类型。
  • 5.malloc申请空间失败时,返回NULL,因此使用时,必须判断是否为空,而使用new就不需要这样的操作,new的空间在申请失败时会直接抛出异常!
  • 6.申请自定义类型的=空间时,malloc只会开辟空间,不会调用构造函数与析构函数,而new在申请空间时会调用构造与析构函数来进行相关对象的初始化和资源的清理。

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

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

相关文章

【图灵完备 Turing Complete】游戏经验攻略分享 Part.4 处理器架构

比较有难度的一个部分。 运算单元ALU,其实就是通过OP选择计算方式,然后选通某个计算,之后输出。每个计算逐个实现就行了。 下面是一个优化占地面积的ALU,变得紧凑了一点。 下面是一个简单的OP选通原理线路。判断是立即数寻址&…

吹爆吊打 GPT-4 的大模型新王者Reflection 70B,是否言过其实?

引言 一觉睡西天,谁知梦里乾坤大。只身眠净土,只道其中日月长。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩。今天这篇小作文主要介绍这几天网上狂吹的开源新晋王者Reflection 70B,该模型…

【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响

选自期刊**《International Journal of Information Management》**(IF:21.0) 医疗保健领域的大数据管理:采用挑战和影响 1、研究背景 本研究的目标是调查阻止医疗机构实施成功大数据系统的组织障碍,识别和评估这些障碍,并为管理…

Qemu开发ARM篇-1、环境搭建篇

文章目录 1、目标2、欢迎来到qemu世界3、开发环境4、依赖安装5、编译安装qemu 1、目标 我们的目标是在x86平台上搭建上arm开发环境,及在x86平台模拟一台arm设备,以达到能快速在x86平台上学习arm相关知识,如uboot启动、kernel开发调试等&…

实时美颜的技术突破:视频美颜SDK与直播美颜工具的开发详解

如今,视频美颜SDK和直播美颜工具的开发,为各类应用提供了技术支持,使得美颜效果更加智能、高效。本文将详细探讨实时美颜的技术突破及其在视频美颜SDK和直播美颜工具中的应用与开发。 一、视频美颜SDK的核心技术 1.人脸检测与特征点识别 视…

稀土抗紫外屏蔽剂在涂层中的应用

稀土抗紫外屏蔽剂的主要作用是有效地吸收或阻挡紫外线,从而保护材料或表面免受紫外线的伤害,延长其使用寿命。 稀土抗紫外屏蔽剂在涂层上的应用具有以下显著优势: 1. 增强涂层的耐久性:稀土抗紫外屏蔽剂能够有效吸收和散射紫外线…

Linux常用命令(部分学习待继续补充)

pwd print working directory 打印当前的工作目录 / 根目录 ls list 列出当前目录下的所有文件 ls / ls -h(human) ls -l(long) cd change directory 更改目录 cd … 回到上一级目录 ls list ls -l 会列出文件的详细信息 第一个字符是-表示普通文件 d表示是一个目录 rwx read …

load jsonl File with OpenAI API request results to pandas data.frame

题意:将包含 OpenAI API 请求结果的 jsonl 文件加载到 pandas DataFrame 中 问题背景: I have a large data set containing around 500k observation. It has a string variable that I want to create an embedding for. I used the OpenAI API to cr…

【练习15】拼三角

链接&#xff1a;A-拼三角_牛客小白月赛32 (nowcoder.com) 分析&#xff1a; 三角形的三个边a、b、c必须满足条件&#xff1a;ab>c,ac>b,bc>a 可以先将输入的六个数按从小到大排序&#xff0c;然后再枚举。 因为已经排好序了&#xff0c;如果第一行ab<c&#xff0c…

LeetCode2414题: 最长的字母序连续子字符串的长度(原创)

【题目描述】 字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说&#xff0c;字符串 "abcdefghijklmnopqrstuvwxyz" 的任意子字符串都是 字母序连续字符串 。 例如&#xff0c;"abc" 是一个字母序连续字符串&#xff0c;而 "acb" 和…

Linux启动流程,0,1,2进程,init进程,idle进程,内核态到用户态的kernel_execve(一)

&#xff1f;是&#xff0c;如果定义了&#xff0c;就按Makefile的&#xff0c;如果如下make编译时&#xff0c;就按如下 linux内核入口 进程0在用户空间看不到&#xff0c;因为他是内核进程 进程2就是守护进程&#xff0c;维护内涵运转的 一生二&#xff0c;二生三&#xff…

【网络安全的神秘世界】攻防环境搭建及漏洞原理学习

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 Kali安装docker 安装教程 PHP攻防环境搭建 中间件 介于应用系统和系统软件之间的软件。 能为多种应用程序合作互通、资源…

2021的OWASP TOP 10

OWASP&#xff08;开放Web应用安全项目&#xff09;是一个非营利性组织&#xff0c;旨在提高软件安全性。 每四年一个更新&#xff0c;2025年就会再次更新&#xff0c;到时候这篇文章也会实时更新。 我主要从定义&#xff0c;场景&#xff0c;原因&#xff0c;影响&#xff0…

特征工程与交叉验证在机器学习中的应用

数据入口&#xff1a;学生考试表现影响因素数据集 - Heywhale.com 本数据集提供了关于影响学生考试成绩的多种因素的全面概述。数据集包含了有关学习习惯、出勤率、家长参与、资源获取等方面的信息。 数据说明 字段名说明Hours_Studied每周学习的小时数Attendance出勤率&…

【2024研赛】【华为杯E题】2024 年研究生数学建模比赛思路、代码、论文助攻

思路将在名片下群聊分享 高速公路应急车道紧急启用模型 高速公路拥堵现象的原因众多&#xff0c;除了交通事故外&#xff0c;最典型的就是部分路段出现瓶颈现象&#xff0c;主要原因是车辆汇聚&#xff0c;而拥堵后又容易蔓延。高速公路一些特定的路段容易形成堵点&#xff0…

2024年华为杯数学建模研赛(B题) 建模解析| 网络吞吐量 |小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮2000人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;实现综合建模。独创复杂系统视角&#xff0c;帮助你解决研赛的难关呀。 完整内容可…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(二)-索引

场景 首先介绍测试的场景&#xff0c;本文schema定义 pdm文档索引&#xff0c;包括nested&#xff0c;扩展字段&#xff0c;文档属性扩展&#xff0c;其中_content字段是组件保留字段&#xff0c;支持文本内容 索引 索引服务索引的操作&#xff0c;包括构建&#xff0c;put …

计算机缺少vcruntime140.dll的解决方法,共有7种简单有效的方法

电脑出现找不到vcruntime140.dll,无法继续执行代码的情况&#xff0c;其实有很多原因。而且解决起来还是比较简单&#xff0c;主要是你要了解这个dll文件&#xff0c;今天小编就来给大家详细的分析一下找不到vcruntime140.dll的多种解决方法。 一、 问题概述 找不到vcruntime…

普元DWS - Linux下安装DWS标准版

1 前言 普元DWS全称是普元数据开发平台。 功能是对不同结构的数据进行转换处理&#xff0c;比如将MySQL的数据转换到达梦数据库中。 本文讲解如何在Linux下安装DWS标准版 2 DWS的版本 普元DWS有两个版本&#xff1a;微服务版和标准版。 微服务版是基于分布式部署的&#x…

linux----进程地址空间

前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、空间分布 二、栈和堆的特点 &#xff08;1&#xff09;栈堆相对而生&#xff0c;堆是向上增长的&#xff0c;栈是向下增长的。 验证&#xff1a;堆是向上增长的 这里我们看到申请的堆&#xff…