C++【内存管理】

        C/C++中程序的内存划分:

  • :又称堆栈,存放非静态的局部变量、函数参数、返回值等等,栈是向下增长的。
  • 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可以使用系统接口创建共享内存,做进程间的通信。
  • :用于程序运行时动态内存分配,堆是向上增长的。
  • 数据段:存储全局数据和静态数据。
  • 代码段:存放可执行的代码、只读常量。

1、C语言中动态内存管理

        malloc / calloc / realloc 有什么区别?

三种函数的函数原型为:(在使用完成之后需要调用free函数进行释放)

void* malloc(size_t size);void* calloc(size_t num,size_t size);void* realloc(void* ptr,size_t size);

主要的差异:malloc分配的空间是未初始化的,内存内的数据是随机值,使用前一般需要手动初始化。calloc对分配的空间进行了初始化,适合那些一开始就初始化为零的场景。realloc在无法完成内存的调整时,会返回NULL指针,并且原内存块依然保留,需要开发者手动释放。

 2、C++的内存管理方式

        C++可以继续使用C语言中的内存管理方式,但是C++也有自己简洁的内存管理函数:new和delete。(像C中的申请和释放一样,new和delete是成对使用的)

void test()
{//动态申请一个int类型的空间int* ptr = new int;//动态申请一个int类型的空间并初始化为6int* ptr1 = new int(6);//动态申请10个int类型的空间int* ptr2 = new int[10];//也就是一个数组,可以使用数组的方式进行初始化int* ptr3 = new int[3] {1, 2, 3};delete ptr;delete ptr1;delete[] ptr2;delete[] ptr3;
}

注意:申请和释放单个元素的空间,使用new和delete操作符。申请和释放连续的空间使用new[]和delete[]。在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。

2.1、operator new 和 operator delete 函数 

        new和delete是用户进行动态内存申请和释放的操作符,operator new 和 operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层调用operator delete全局函数来释放空间。

      operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请失败,尝试执行空间不足的应对措施,如果成功就返回,否则就抛异常。

      operator delete:该函数最终通过free来释放空间。 

2.2、new和delete的实现原理 

 2.2.1、内置类型

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

2.2.2、自定义类型

  •  new 原理:
  • delete原理:
    new

    1.调用operator new函数申请空间。

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

    delete

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

    2.再调用operator delete函数释放对象的空间。

    new T[]

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

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

    delete[]

    1.在释放的对象空间上执行N次析构函数,完成对N个对象中的资源清理。

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

3、问答题 

1、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指针,在使用时必须进行判断是否为NULL。new不需要,但是new一般需要捕获异常。

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


2、什么是内存泄漏,内存泄漏的危害 

        内存泄漏(Memory Leak)是指程序在运行过程中,由于疏忽或错误的编程,导致已分配的内存空间不再被使用时,没有及时被释放回收,使得这些内存无法被再次利用,持续占据系统内存资源。

        当内存泄漏到一定程度时,系统内存被耗尽,操作系统无法再为新的进程或或线程分配必要的内存资源,最终导致整个系统崩溃。即使系统没有崩溃,泄露的内存长时间闲置,也会极大地降低计算机系统的资源利用率。

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

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

相关文章

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发,简单说就是让你用得起高大上的智能设备,不管是最新款的手机、平板,还是那些炫酷的智能耳机,这个平台应有尽有。想要体验但又不希望花大钱?那你就找对地方了!通过灵活的租赁方案…

【开源免费】基于SpringBoot+Vue.JS校园社团信息管理系统(JAVA毕业设计)

本文项目编号 T 107 ,文末自助获取源码 \color{red}{T107,文末自助获取源码} T107,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才…

使用npm包的工程如何引入mapboxgl-enhance/maplibre-gl-enhance扩展包

作者:刘大 前言 在使用iClient for MapboxGL/MapLibreGL项目开发中,往往会对接非EPSG:3857坐标系的地图,由于默认不支持,因此需引入mapboxgl-enhance/maplibre-gl-enhance扩展包。 在使用Vue等其他框架,通过npm包下载…

应急指挥系统总体架构方案

引言 应急指挥系统总体架构方案旨在构建一个高效、智能的应急管理体系,以应对自然灾害、事故灾难等突发事件,保障人民生命财产安全。 背景与挑战 近年来,安全生产形势严峻,自然灾害事故频发,对应急指挥系统的要求越…

如何用CSS3创建圆角矩形并居中显示?

在网页设计中,圆角矩形因其美观和现代感而被广泛使用,居中显示元素也是一个常见的需求。今天,我们将学习如何使用CSS3的border-radius属性来创建圆角矩形,并将其居中显示在页面上。 如果你正在学习CSS,那么这个实例将非…

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中,控制材质的参数值和向量值

canvas+fabric实现时间刻度尺(二)

前言 我们前面实现了时间刻度尺&#xff0c;鼠标移动显示时间&#xff0c;接下来我们实现鼠标点击某个时间进行弹框。 效果 实现 1.监听鼠标按下事件 2.编写弹框页面 3.时间转换 <template><div><canvas id"rulerCanvas" width"1200"…

手机实时提取SIM卡打电话的信令声音-双卡手机来电如何获取哪一个卡的来电

手机实时提取SIM卡打电话的信令声音 --双卡手机来电如何获取哪一个卡的来电 一、前言 前面的篇章《手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案》中&#xff0c;我们论述了局域网SIP坐席通过手机外呼出去时&#xff0c;手机中主副卡的呼叫调度策略。 但…

离线语音识别+青云客语音机器人(幼儿园级别教程)

1、使用步骤 确保已安装以下库&#xff1a; pip install vosk sounddevice requests pyttsx3 2、下载 Vosk 模型&#xff1a; 下载适合的中文模型&#xff0c;如 vosk-model-small-cn-0.22。 下载地址&#xff1a; https://alphacephei.com/vosk/models 将模型解压后放置在…

Streaming Dense Video Captioning

原文出处 CVPR 原文链接 [2404.01297] Streaming Dense Video Captioninghttps://arxiv.org/abs/2404.01297 原文笔记 What 1、提出了一种基于聚类传入token的新记忆模块&#xff0c;该模块可以处理任意长的视频&#xff0c;并且可以在不访问视频所有帧的情况下处理视频(…

TCP 连接:三次握手与四次挥手

TCP 协议&#xff0c;全称为“传输控制协议”。 1. TCP 协议段格式 给出几个定义 &#xff1a; 16位源端口号 &#xff1a;用于标识发送端的应用程序。 16位目的端口号 &#xff1a;用于标识接收端的目标应用程序。 32位序号 &#xff1a;用于标识发送的每一个字节流中的第一…

IDEA+Docker一键部署项目SpringBoot项目

文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功&#xff0c;本地打开页面是空白&#xff0c;控制台报错 重新下载了vue-loa…

【微服务】【Sentinel】认识Sentinel

文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…

STM32完全学习——使用定时器1精确延时

一、定时器的相关配置 首先一定要是递减定时器&#xff0c;递增的不太行&#xff0c;控制的不够准确&#xff0c;其次在大于10微秒的延时是非常准确的&#xff0c;小于的话&#xff0c;就没有那没准&#xff0c;但是凑合能用。误差都在一个微秒以内。使用高级定时器也就是时钟…

connect to host github.com port 22: Connection timed out 的解决方法

原因是 Github 被 GFW 屏蔽了。 Windows 系统&#xff0c;打开 C:\Windows\System32\drivers\etc&#xff0c;复制其中的 hosts 文件至桌面&#xff0c;用文本编辑器或者其他工具打开。 复制以下内容进去&#xff1a; 140.82.114.4 github.com 151.101.1.6 github.global.ss…

常见的排序算法过程和比较分析

比较分析 排序类别排序算法时间复杂度&#xff08;最好&#xff09;时间复杂度&#xff08;最坏&#xff09;时间复杂度&#xff08;平均&#xff09;辅助空间复杂度稳定性插入排序直接插入排序O(n)O(n)O(n)O(1)稳定插入排序折半插入排序O(n)O(n)O(n)O(1)稳定插入排序希尔排序…

【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 添加图层3. 制作千层饼一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的7.3.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软件 打开QGIS软件。 QGIS软件主界面。