C++入门5——C/C++动态内存管理(new与delete)
目录
1. 一图搞懂C/C++的内存分布
2. 存在动态内存分配的原因
3. C语言中的动态内存管理方式
4. C++内存管理方式
4.1 new/delete操作内置类型
4.2 new/delete操作自定义类型
1. 一图搞懂C/C++的内存分布
说明:
1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结 束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是 分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。
3. 数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。
4. 代码区:存放函数体(类成员函数和全局函数)的二进制代码。
2. 存在动态内存分配的原因
现在我们最朗朗上手的内存开辟方式有:
int a = 10;//在栈空间上开辟4个字节的空间int arr[100] = { 0 };//在栈空间上开辟100×4个字节的空间
上述两种方法开辟空间的方式有两个特点:
1. 空间开辟大小是固定的;
2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
但是对于空间的需求,不仅仅是上述的情况。有时我们需要的空间大小在程序运行时才能知道。
其如果比我们开辟的空间大,程序会不会报错呢?如果比我们开辟的空间小,那又会不会造成内存浪费,降低运行效率呢?
所以这种静态的内存开辟方式就不能满足我们的需求了,那该如何来解决呢?
这时动态的内存开辟或许就可以满足我们的需求。
3. C语言中的动态内存管理方式
C语言中的动态内存管理方式为malloc、calloc、realloc、free函数的使用,具体请看:详解C/C++动态内存函数(malloc、free、calloc、realloc)
4. C++内存管理方式
我们说过,C++是兼容C语言的,所以C语言的内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
了解C++的类与对象之后,我们知道了内置类型和自定义类型,我们似乎可以发现,在学习了C++的很多知识后,好像很大一部分篇幅都在介绍处理自定义类型的情况,这些也恰巧可以体现C++面向对象的原因,所以,对于new和delete我们也应该分为内置类型与自定义类型来讨论。
4.1 new/delete操作内置类型
new/delete操作内置类型与malloc、calloc、realloc、free函数除了用法上,其他方面没有任何区别,用法也完全可以照猫画虎,不过确实new/delete更为方便:
void test()
{// ①动态申请一个int类型的空间//malloc//int* ptr1 = (int*)malloc(sizeof(int));//newint* ptr1 = new int;// ②动态申请一个int类型的空间并初始化为10//malloc/*int* ptr2 = (int*)malloc(sizeof(int));if (ptr2 == NULL){perror("malloc");exit(-1);}*ptr2 = 10;*///newint* ptr2 = new int(10);//③ 动态申请10个int类型的空间//calloc/*int* ptr3 = (int*)calloc(10, sizeof(int));if (ptr3 == NULL){perror("calloc");exit(-1);}*///newint* ptr3 = new int[10];//④动态申请10个int类型的空间,并初始化成1~10//直接演示new:int* ptr4 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };//(如果未初始化完全,其余默认初始化为0)//free/*free(ptr1);ptr1 = NULL;*///deletedelete ptr1;delete ptr2;delete[] ptr3;delete[] ptr4;
}
(注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用 new[]和delete[],要匹配起来使用。)
4.2 new/delete操作自定义类型
我们已经说了,new/delete与malloc、calloc、realloc、free除了用法上,其他方面没有区别,那既然已经有了后者,为什么还要再引入new/delete呢?仅仅是为了用法上更方便一些吗?
答案当然不是的,没有任何区别仅仅是针对内置类型来说的,我们在学习操作符重载时就发现,+、-、*、/ 这些运算符对于自定义类型并不能直接拿来用,需要加以重载我们才可以使用。
malloc、calloc、realloc、free这些函数也是同样的道理,所以针对自定义类型,new与delete就应运而生了。
那么,我们就跟着new/delete操作内置类型的用法照猫画虎,来试一下自定义类型A:
#include <iostream>
using namespace std;class A
{
public://构造函数A(int a = 0):_a(a){cout << "调用了构造函数 " << this << endl;}//析构函数~A(){cout << "调用了析构函数 " << this << endl;}private:int _a;
};int main()
{//动态申请1个A类型的空间并初始化为1A* a1 = new A(1);delete a1;return 0;
}
运行结果:
从运行结果来看:
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。
所以我们可以说:
new的本质:开空间+调用构造函数初始化;
delete的本质:调用析构函数+释放空间。
另外,熟悉一下用new对自定义类型开多个空间:
int main()
{//动态申请3个A类型的空间并初始化为1~3//方法①:有名对象/*A a1(1);A a2(2);A a3(3);A* aa1 = new A[3]{ a1,a2,a3 };delete[] aa1;*///方法②:匿名对象A* aa2 = new A[3]{ A(1),A(2),A(3) };delete[] aa2;//方法③:巧用构造函数的隐式类型转换A* aa3 = new A[3]{ 1,2,3 };delete[] aa3;return 0;
}
(本篇完)
相关文章:

C++入门5——C/C++动态内存管理(new与delete)
目录 1. 一图搞懂C/C的内存分布 2. 存在动态内存分配的原因 3. C语言中的动态内存管理方式 4. C内存管理方式 4.1 new/delete操作内置类型 4.2 new/delete操作自定义类型 1. 一图搞懂C/C的内存分布 说明: 1. 栈区(stack):在…...
leetcode 743.网络延时时间
思路:迪杰斯特拉最短路径 总结起来其实就两件事: 1.从所给起点开始能不能到达所有点; 2.如果能够到达所有点,那么这个时候需要判断每一个点到源点的最短距离,然后从这些点中求出最大值。 所以用最小路径求解是最划…...

MATLAB导入导出Excel的方法|读与写Excel的命令|附例程的github下载链接
前言 前段时间遇到一个需求:导出变量到Excel里面,这里给出一些命令,同时给一个示例供大家参考。 MATLAB读/写Excel的命令 在MATLAB中,可以使用以下命令来读写Excel文件: 读取Excel文件: xlsread(filen…...
【第4章】SpringBoot实战篇之登录优化(含redis使用)
文章目录 前言一、整合redis1. 引入库2. 配置 二、登录优化1.登录2.拦截器3. 登出4. 修改密码 总结 前言 上一章的登录接口,我们将用户登录信息放置于Map中,存在一个问题,集群部署无法共享以及应用停止用户登录信息即丢失,接下来我们整合redis来整合这个问题。 一、整合redis …...

数据结构:详解二叉树(树,二叉树顺序结构,堆的实现与应用,二叉树链式结构,链式二叉树的4种遍历方式)
目录 1.树的概念和结构 1.1树的概念 1.2树的相关概念 1.3树的代码表示 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的存储结构 2.3.1顺序存储 2.3.2链式存储 3.二叉树的顺序结构和实现 3.1二叉树的顺序结构 3.2堆的概念和结构 3.3堆的特点 3…...

HarmonyOS-9(stage模式)
配置文件 {"module": {"requestPermissions": [ //权限{"name": "ohos.permission.EXECUTE_INSIGHT_INTENT"}],"name": "entry", //模块的名称"type": "entry", //模块类型 :ability类型和…...
RestTemplate代码内部访问RESTful服务的客户端工具
1. 前言 在当今的互联网时代,RESTful服务已经成为了一种流行的服务架构风格,它提供了简单、轻量级、灵活、可扩展的方式来构建和访问Web服务。而在Java开发中,Spring框架提供了一个非常方便的工具——RestTemplate,用于访问和调用…...
Flutter 中的 SliverLayoutBuilder 小部件:全面指南
Flutter 中的 SliverLayoutBuilder 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,它提供了丰富的组件来帮助开发者构建高性能、美观的跨平台应用。在 Flutter 的滚动视图系统中,SliverLayoutBuilder 是一个允许开发者根据当前滚动位置…...

家政预约小程序11新增预约
目录 1 创建数据源2 创建页面3 显示选中的服务信息4 设置表单容器5 配置地图6 配置预约成功页面7 从详情页到预约页总结 用户在浏览家政小程序的具体服务时,如果希望预约的,可以在详情页点击立即预约按钮,填写具体的信息,方便家政…...

AI雷达小程序个人名片系统源码 PHP+MYSQL组合开发 带完整的安装代码包以及搭建教程
系统概述 随着移动互联网的普及和社交媒体的兴起,人们获取信息和建立联系的方式发生了翻天覆地的变化。传统的纸质名片已经无法满足现代人的需求,而小程序作为一种轻量级应用,具有无需安装、即开即用、易于分享等特点,成为了个人…...

Kafka生产者消息异步发送并返回发送信息api编写教程
1.引入依赖(pox.xml文件) <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>3.6.2</version> </dependency> </depende…...

WiFi串口服务器与工业路由器:局域网应用的协同之力
在工业物联网(IIoT)迅猛发展的当下,局域网(LAN)作为连接工业设备与数据中心的桥梁,其重要性日益凸显。WiFi串口服务器与工业路由器作为局域网中的关键组件,以其独特的性能和功能,为传…...
Unity功能——通过按键设置物体朝左/右旋转(含C#转xlua版)
博文简介: 开发场景:unity的3d场景; 功能:当设定的键被按下时,进行物体朝左/右旋转; 适用范围:本文代码适用于设置3d物体朝左右旋转,也适用于设置UI对象朝左右旋转…...
泛微ecology开发修炼之旅
我将多年泛微ecology开发经验,进行了总结,然后分享给大家。 泛微开发修炼之旅 泛微开发修炼之旅--01搭建开发环境 泛微开发修炼之旅--02开发接口demo 泛微开发修炼之旅--03常用数据表结构讲解 泛微开发修炼之旅--04常用数据库操作工具类封装 。。。。 我…...
PostgreSQL的视图pg_locks
PostgreSQL的视图pg_locks pg_locks 是 PostgreSQL 提供的系统视图,用于显示当前数据库中的锁信息。通过查询这个视图,数据库管理员可以监控锁的使用情况,识别潜在的锁争用和死锁问题,并优化数据库性能。 pg_locks 视图字段说明…...

元宇宙NFG结合IPO线上营销模型合理降税
在当今快速演进的互联网和区块链技术背景下,我们见证了从移动端购物到区块链热潮,再到如今市场竞争日趋激烈的变革。尤其是在2024年这个关键节点,许多平台为了吸引用户,推出了各种创新的商业模式。然而,如何在这样的环…...

Python打印当前目录下,所有文件名的首字母
代码如下: #!/usr/bin/env python3 """ 按顺序打印当前目录下,所有文件名的首字母(忽略大小写) """ import sys from pathlib import Pathdef main() -> None:ps Path(__file__).parent.glob(…...

程序员应该有什么职业素养?
程序员的六大职业素养:构建成功职业生涯的基石 在不断变化的技术世界中,程序员不单要保持技术的锋利,也需要培养相应的职业素养,这些素养在很大程度上决定了一个程序员的职业生涯能否走得长远。以下是我认为最为重要的六大职业素…...

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】
在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…...

Flink的简单学习二
一 Flink的核心组件 1.1 client 1.将数据流程图DataFlow发送给JobManager。 1.2 JobManager 1.收集client的DataFlow图,将图分解成一个个的task任务,并返回状态更新数据给client 2.JobManager负责作业调度,收集TaskManager的Heartbeat和…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...