【05】C++ 内存管理

news2024/11/20 20:24:01

文章目录

  • 🌈 Ⅰ C++ 内存分布
  • 🌈 Ⅱ C++ 内存管理方式
    • 1. new 和 delete 操作内置类型
    • 2. new 和 delete 操作自定义类型
  • 🌈 Ⅲ operator new 和 operator delete
  • 🌈 Ⅳ new 和 delete 的实现原理
    • 1. 内置数据类型
    • 2. 自定义数据类型
  • 🌈 Ⅴ malloc / free 和 new / delete 的区别

🌈 Ⅰ C++ 内存分布

C++ 中程序内存区域划分

内存区域说明
内核空间用户代码不能读写
向下增长 ↓,存储定义在函数内的局部变量
内存映射段文件映射、动态库、匿名映射
向上增长 ↑,用于存储动态开辟出来的空间
数据段也叫静态区,用于存包处全局数据、静态数据
代码段存储可执行代码 / 只读常量

🌈 Ⅱ C++ 内存管理方式

  • C++ 中通过 new 和 delete 操作符来替代 C语言 中 malloc 和 free 的功能

1. new 和 delete 操作内置类型

1. new 和 delete 操作内置类型格式

  • 创建和删除 单个 对象
内置类型* 对象名 = new 内置类型;

delete 对象名;
  • 创建和删除 多个 对象
内置类型* 对象名 = new 内置类型(你要 new 出来的数量);

delete[] 对象名;

2. new 和 delete 操作内置类型示例

  • 这里主要采用 int 类型作为演示,其他 C++ 内置的数据类型也可以这么整。

在这里插入图片描述

2. new 和 delete 操作自定义类型

  • 在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数

1. new 和 delete 操作自定义类型格式

  • 创建和删除 单个 对象
自定义类型名* 对象名 = new 自定义类型名(传给构造函数的参数);

delete 对象名;
  • 创建和删除 多个 对象
自定义类型名* 对象名 = new 自定义类型名[创建对象的数量];

delete[] 对象名;

2. new 和 delete 操作自定义类型示例

class date
{
public:
	date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout << "这是一个构造函数" << endl;
	}

	~date()
	{
		cout << "这是一个析构函数" << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	date* d1 = new date;			// new 一个日期类东西,并用缺省参数调用构造函数初始化
	date* d2 = new date(2024,2, 9);	// new 一个日期类对象,并用所给的值调用构造函数初始化
	date* d3 = new date[3];			// new 三个日期类对象,并对每个对象使用缺省参数初始化

	delete d1;						// 删除 new 出来的单个对象
	delete d2;
	delete[] d3;					// 删除 new 出来的多个对象
	
	return 0;
}

🌈 Ⅲ operator new 和 operator delete

概念

  • operator new 和 operator delete 是全局函数,不是对 new 和 delete 的重载。
  • new 在底层调用 operator new 函数申请空间,delete 则调用 operator delete 函数释放空间。
  • operator new 是对 malloc 的封装,operator delete 是对 free 的封装。

本质

  • operator new 实际上是通过 malloc 来申请空间,如果 malloc 申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。
  • operator delete 实际上是通过 free 来释放空间

🌈 Ⅳ new 和 delete 的实现原理

1. 内置数据类型

  • 如果申请的是内置类型的空间,new 和 malloc,delete 和 free 基本类似。
  • 不同的地方是 new / delete 申请和释放的是单个元素的空间,new [] 和 delete[] 申请和释放的是连续的空间。
  • new 在申请空间失败时会抛出异常,而 malloc 是返回 NULL。

2. 自定义数据类型

1. new 和 delete 的原理

  • new:先调用 operator new 函数申请空间,再在申请的空间上执行构造函数。
  • delete:先在空间上执行析构函数,完成对象中资源的清理工作。再调用 operator delete 函数去释放对象的空间。

在这里插入图片描述

2. new T[n] 和 delete[] 的原理

  • new T[n]:先调用 operator new[] 函数,在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。
  • delete[]:先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间,实际是在 operator delete[] 中调用 operator delete 来释放空间。

在这里插入图片描述

🌈 Ⅴ malloc / free 和 new / delete 的区别

1. 共同点

  • 都是从堆上申请空间,并且都需要用户主动释放。

2. 不同点

  1. malloc 和 free 是函数,而 new 和 delete 是操作符。
  2. malloc 申请的空间不会被初始化,new 可以初始化申请的空间。
  3. malloc 申请空间时,还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可,如果要 new 多个对象,只需在 [] 中指定对象个数即可。
  4. malloc 的返回值为 void*,在使用时必须要进行强转。而 new 因为后面跟着该空间的类型,因此不需要对返回值进行强转。
  5. malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常,不需要手动检查。
  6. 申请自定义类型对象时,malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化,delete 在释放空间前会调用析构函数。

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

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

相关文章

leetcode 3027. 人员站位的方案数 II【离散化前缀和+枚举】

原题链接&#xff1a;3027. 人员站位的方案数 II 题目描述&#xff1a; 给你一个 n x 2 的二维数组 points &#xff0c;它表示二维平面上的一些点坐标&#xff0c;其中 points[i] [xi, yi] 。 我们定义 x 轴的正方向为 右 &#xff08;x 轴递增的方向&#xff09;&#x…

架构之模板方法等模式的使用

目录 一、程序编写背景 二、编程思路讲解 - 类图 - 实现逻辑 - 工厂模式 - 模板方法模式 接口类&#xff08;代码&#xff09;抽象类&#xff08;代码&#xff09;具体实现类&#xff08;代码&#xff09;工厂类&#xff08;代码&#xff09;注册类&#xff08;代码&…

租用海外服务器丢包是什么情况?

在当今的互联网时代&#xff0c;海外服务器租用已经成为了许多企业和个人的选择。然而&#xff0c;在使用海外服务器的过程中&#xff0c;有时会出现丢包的情况&#xff0c;这给用户带来了不小的困扰。那么&#xff0c;租用海外服务器丢包是什么情况呢&#xff1f;本文将对此进…

【Python】Mac 本地部署 stable-diffusion

其实要在本地部署 stable-diffusion 不难&#xff0c;只要有“魔法”一切都水到渠成&#xff0c;如下图&#xff1a; (base) MacBook-Pro python % git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui Cloning into stable-diffusion-webui... remote: Enu…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

2.7日学习打卡----初学RabbitMQ(二)

2.7日学习打卡 JMS 由于MQ产品很多&#xff0c;操作方式各有不同&#xff0c;于是JAVA提供了一套规则 ——JMS&#xff0c;用于操作消息中间件。JMS即Java消息服务 &#xff08;JavaMessage Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面 向消息中间件的…

ssm+vue的医药垃圾分类管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的医药垃圾分类管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

在本地运行大型语言模型 (LLM) 的六种方法(2024 年 1 月)

一、说明 &#xff08;开放&#xff09;本地大型语言模型&#xff08;LLM&#xff09;&#xff0c;特别是在 Meta 发布LLaMA和后Llama 2&#xff0c;变得越来越好&#xff0c;并且被越来越广泛地采用。 在本文中&#xff0c;我想演示在本地&#xff08;即在您的计算机上&#x…

Android 粒子喷泉动效

一、前言&#xff1a; 在学习open gl es实现动效的时候&#xff0c;打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别&#xff0c;以及难易程度&#xff0c;因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理&#xff1a; 粒子动效本质上…

504. Base 7(七进制数)

题目描述 给定一个整数 num&#xff0c;将其转化为 7 进制&#xff0c;并以字符串形式输出。 问题分析 按照二进制转换的方式进行转换即可 代码 char* convertToBase7(int num) {int count 0;char *x (char *)malloc(sizeof(char)*32);char *y (char *)malloc(sizeof(c…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)

【Redis】深入理解 Redis 常用数据类型源码及底层实现&#xff08;1.结构与源码概述&#xff09;-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry & redisObject详解)-CSDN博客 紧接着前两篇的总体介绍&#xff0c;从这篇开始&#x…

windows安装sqlite

windows安装sqlite比linux麻烦很多 1.下载 下载链接&#xff1a;链接 下载dll的zip文件 2.解压并放到文件夹 将压缩包内的文件解压&#xff0c;放到C://sqlite下 3.编辑环境变量 添加到系统变量的path中 4.验证 打开命令提示符&#xff0c;输入 sqlite3有结果就行

JavaWeb02-MyBatis

目录 一、MyBatis 1.概述 2.JavaEE三层架构简单介绍 &#xff08;1&#xff09;表现层 &#xff08;2&#xff09;业务层 &#xff08;3&#xff09;持久层 3.框架 4.优势 &#xff08;1&#xff09;JDBC的劣势 &#xff08;2&#xff09;MyBatis优化 5.使用 &#…

Golang的for循环变量和goroutine的陷阱,1.22版本的更新

先来看一段golang 1.22版本之前的for循环的代码 package mainimport "fmt"func main() {done : make(chan bool)values : []string{"chen", "hai", "feng"}for _, v : range values {fmt.Println("start")go func() {fmt.P…

Gemini 下一章节即将拉开帷幕

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

树与二叉树---数据结构

树作为一种逻辑结构&#xff0c;同时也是一种分层结构&#xff0c;具有以下两个特点&#xff1a; 1&#xff09;树的根结点没有前驱&#xff0c;除根结点外的所有结点有 且只有一个前驱。 2&#xff09;树中所有结点可以有零个或多个后继。 树结点数据结构 满二叉树和完全二…

洛谷使用指南

详细看——洛谷的规则 1.注册账号 1.打开洛谷首页 这样就对了&#xff01;&#xff01;&#xff01; 2.点击注册 当显示以上页面时表示进入了注册页面。 3.登录 当注册好后就可以登陆了。 当显示以上页面时表示进入了登录页面。 2.题库使用 当单击题库后&#xff0c;会出…

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

二、OpenAI开发者快速入门

启动并运行OpenAI API OpenAI API 为开发者提供一个简单的接口&#xff0c;使其能够在他们的应用中创建一个智能层&#xff0c;由OpenAI最先进的模型提供支持。聊天补全端点为ChatGPT提示支持&#xff0c;一种简单的方法是&#xff1a;输入文本&#xff0c;使用GPT-4模型输出。…

在JSP中实现JAVABEAN

在JSP中实现JAVABEAN 问题陈述 创建Web应用程序以连接数据库并检索作者名、地址、城市、州及邮政编码等与作者的详细信息。JavaBean组件应接受作者ID、驱动程序名及URL作为参数。信息要从authors表中检索。 解决方案 要解决上述问题,需要执行以下任务: 创建Web应用程序。创…