内存管理【C++】

内存分布

C++中的内存区域主要有以下5种

  1. 栈(堆栈):存放非静态局部变量/函数参数/函数返回值等等,栈是向下增长的【地址越越先被使用】。栈区内存的开辟和销毁由系统自动执行

  2. 堆:用于程序运行时动态内存分配,由程序员申请和释放内存,堆是向上增长的【地址越越先被使用】。

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

  4. 数据段(全局区):存储全局数据静态数据

  5. 代码段(常量区):存放可执行的代码/只读常量


C++动态内存管理

动态内存申请

动态内存申请,申请的是堆区的内存

申请一个类型大小的空间

不初始化申请的空间语法:

T* p=new TT代指类型,p可以是任意合法标识符

int* p = new int;

即可申请1个int类型大小的未初始化的空间


初始化申请内置类型的空间语法:

T* p=new T(要初始化的值)T代指类型,p可以是任意合法标识符

int* p = new int(200);

即可申请1个int类型大小的初始化为200的空间


调用指定构造函数申请自定义类型的空间语法:

T* p=new T(传给自定义类型的构造函数的参数)T代指类型,p可以是任意合法标识符


申请连续多个类型大小的空间

不初始化申请的空间语法:

T* p=new T【n】T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

int* p = new int[12];

即可申请连续12个int类型大小未初始化的空间


初始化申请内置类型的空间语法:

T* p=new T【n】{初始值1,初始值2,……}T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

int* p = new int[12] {1,2,3,4,5,6};

即可申请连续12个int类型大小的前6个int空间的值为1,2,3,4,5,6,后6个int空间值为0的空间


调用指定构造函数申请自定义类型的空间语法:

T* p=new T【n】{{传给第一个自定义类型的构造函数的参数},{传给第二个}T代指类型,p可以是任意合法标识符,n是要申请的连续的类型空间的个数

在这里插入图片描述


动态内存释放

释放一个类型大小的空间

语法:
delete pp是存放了动态内存申请的空间的首地址的指针

int* p = new int;delete p;

释放连续多个类型大小的空间

语法:
delete[] pp是存放了动态内存申请的空间的首地址的指针

int* p = new int[12];delete[] p;

operator new和operator delete

这两个都是库里实现好的全局函数
operator new是C语言的malloc的封装函数,主要封装了malloc失败时不在返回NULL而是抛异常

申请空间本质上还是使用malloc

operator delete是C语言的free的封装函数

释放空间本质上还是使用free


new和delete以及new T[]和delete[]实现原理

new

  1. 先调用operator new函数申请空间
  2. 如果是自定义类型就再调用它的构造函数

delete

  1. 如果是自定义类型就调用它的析构函数
  2. 调用operator delete 释放申请的空间

new T[n]

  1. 调用operator new申请连续的n个类型大小的空间
  2. 如果是自定义类型就再调用n次它的构造函数

delete[]

  1. 如果是自定义类型调用n次它的析构函数
  2. 调用operator delete释放连续的n个类型大小的空间

new的delete与malloc和free的区别

  1. malloc和free是函数,new和delete是操作符

  2. malloc申请的空间不能初始化,new可以初始化

  3. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

  4. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

  5. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

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

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

相关文章

电脑丢失api-ms-win-crt-runtime-l1-1-0.dll的多种修复方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中,它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常运行&#xf…

前端面试题:var const let的区别

1 作用域 var声明的变量具有函数级作用域,这意味着它们在全局作用域或函数内部都有效,且可以被全局访问。 let和const声明的变量具有块级作用域,这意味着它们只在声明它们的代码块内有效,不能跨块或跨函数访问。 2 变量提升 va…

大型企业用什么文件加密软件,五款适合企业的文件加密软件

大型企业在选择文件加密软件时,通常会倾向于那些能够提供全面数据保护、具有高度可定制性、易于管理且能适应复杂组织结构的解决方案。以下是一些适合大型企业使用的文件加密软件: 1.域智盾软件: 作为一款企业级文件加密软件,支持…

曲面细分技术在AI去衣中的创新应用

引言: 随着人工智能技术的飞速发展,其在图像处理领域的应用日益广泛。其中,AI去衣技术因其独特的应用场景而备受瞩目。在这一技术的发展过程中,曲面细分技术发挥了至关重要的作用。本文将深入探讨曲面细分技术在AI去衣中的作用及其…

C语言-单精度和双精度浮点型

文章目录 一、遇到的问题二、解决方案三、问题根因float和double的区别: 总结-浮点数 一、遇到的问题 将NXP项目的代码移植到RH850F1K的项目上时,程序运行异常: u16Volt (uint16)((double)u16ADVal * (double)6.3) 执行到这一行程序就跑飞了…

vue3可以快速简单的操作dom元素了

再也不需要用document.getElementById("myElement")的这种方式来对dom元素进行操作了 我们需要使用模板引用——也就是指向模板中一个 DOM 元素的 ref。我们需要通过这个特殊的 ref attribute 来实现模板引用&#xff1a; <script setup> import { ref, onMo…

wafw00f一键检测目标防火墙信息(KALI工具系列十五)

目录 1、KALI LINUX简介 2、wafw00f工具简介 3、在KALI中使用lbd 3.1 查看可检测的防火墙对象 3.2 目标防火墙种类检测 3.3 目标防火墙详细信息检测 3.4 将检查结果输出 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&#xff0c;广…

最好的电脑数据恢复软件是什么

由于硬件故障、恶意软件攻击或意外删除而丢失文件可能会造成巨大压力。数据丢失会扰乱日常运营&#xff0c;造成宝贵的业务时间和资源损失。在这些情况下&#xff0c;数据恢复软件是检索丢失或损坏数据的最简单方法。 数据恢复软件何时起作用&#xff1f; 对于 Windows 数据恢…

vue3组件传值---vue组件通过属性,事件和provide,inject进行传值

通过属性传值&#xff08;父传子&#xff09; vue的组件具有props自建属性&#xff08;自定义名称&#xff0c;类似于class&#xff0c;id的属性&#xff09;&#xff0c;通过这个属性&#xff0c;父组件可以向子组件传递参数&#xff0c;从而实现组件之间的信息传递&#xff0…

Django模块连接redis

1 安装django-redis pip3 install django-redis 2、配置settings.py CACHES{"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":"redis://"redis_host":"redis_port, #redis主机…

CSDN UI 2024.06.01

当我们的栏目很多的时候&#xff0c;通过【置顶】来排列顺序是很麻烦的&#xff0c;应该加一列&#xff0c;设置优先级别。太难用了 或者加两个按钮【上移】 【下移】

Spring Boot(七十六):集成Redisson实现布隆过滤器(Bloom Filter)

之前在redis(17):什么是布隆过滤器?如何实现布隆过滤器?中介绍了布隆过滤器,以及原理,布隆过滤器有很多实现和优化。之前我们讲解了由 Google 开发著名的 Guava 库实现布隆过滤器(Bloom Filter)。下面我们讲解基于Redisson实现布隆过滤器。 1 Redisson简介 Redisson…

正缘画像 api数据接口

测测正缘画像&#xff0c;相貌特征&#xff0c;高矮胖瘦&#xff0c;黑白美丑&#xff0c;对方何许人也&#xff0c;远嫁近娶&#xff0c;何方定居&#xff0c;家庭观&#xff0c;持家爱家&#xff0c;生活质量&#xff0c;富裕贫穷&#xff0c;健康情况&#xff0c;测算结果仅…

极验4点选逆向 JS逆向分析 最新版验证码

目录 声明&#xff01; 一、请求流程分析 二、加密参数w与payload 三、参数w生成位置 四、结果展示&#xff1a; 原创文章&#xff0c;请勿转载&#xff01; 本文内容仅限于安全研究&#xff0c;不公开具体源码。维护网络安全&#xff0c;人人有责。 声明&#xff01; 本文章…

代码随想录算法训练营第四十五天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零

代码随想录算法训练营第四十五天 1049. 最后一块石头的重量 II 题目链接&#xff1a;1049. 最后一块石头的重量 II 将所有石头分成2组&#xff0c;两组的重量尽可能相等&#xff0c;差值最小。 计算石头总重&#xff0c;再除以2就是目标重量&#xff0c;求要达到该重量能装的…

java —— Comparable 接口和 Comparator 比较器

一、Comparable 接口 当一个自定义的类&#xff0c;比如 Student 需要存储在 TreeSet 集合当中&#xff0c;可以为 Student 实现 Comparable 接口。因为 TreeSet 集合内部的元素是自然排序&#xff0c;而系统根本不知道自定义的类如何排序&#xff0c;所以需要我们人为地定义排…

升级笔记本

笔记本型号参数&#xff1a;Acer V5-573G CPU:I5 4200U 1.6GHz 最高2.6GHz 双核四线程 内存&#xff1a;4G 1600M DDR3L SO-DIMM 显卡&#xff1a;独立显卡NVIDIA GeForce GT 750M 硬盘&#xff1a;1T 5400转 屏幕&#xff1a;15.6英寸 1920*1080 【Acer V5-573G-54204G1…

WIFI 万[néng]钥匙 v5.0.10/v4.9.80 SVIP版!

WiFi Master Key v5.0.10/v4.9.80 WIFI万[Nng]钥匙APP是一款专业的网络连接工具&#xff0c;设计宗旨在于为用户提供方便快捷的WiFi接入方案。本应用集成了覆盖全国的大量免费WiFi热点信息&#xff0c;确保用户能够在不同地区快速而稳定地连接到互联网。此外&#xff0c;该应用…

atcoder350,351,352,353,354,355期部分题解

声明&#xff1a;有些题感觉已经说到很明白了&#xff0c;就先不写代码了&#xff0c;有空会补上 目录 350D: new friend 350E: toward 0 351D:Grid and Magnet 352D:permutation subsequence 353C: sigma problem 353D: another sigma problem 354C: atcoder magics …

Java面经(附源码分析)

String、StringBuffer和StringBuilder的区别&#xff1a; 首先String内部的字符数组是使用final修饰&#xff0c;无法修改&#xff0c;每次修改其实是创建一个新的String对象&#xff0c;为了高效字符串操作&#xff0c;引入了StringBuffer和StringBuilder。但StringBuffer的线…