【面试八股总结】C++内存管理:内存分区、内存泄漏、new和delete、malloc和free

参考资料:代码随想录、阿秀

一、内存分区

(1)栈区

        在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存有限。

(2)自由存储区

        如果说堆是操作系统维护的⼀块内存,那么⾃由存储区就是C++中通过new和delete动态分配和释放 对象的抽象概念。需要注意的是,⾃由存储区和堆比较像,但不等价。

(3)堆区

        用于存储动态分配的内存的区域,由程序员手动分配和释放。使用new和delete或者malloc和free进行堆内存的释放和分配。

(4)全局/静态存储区

        全局变量和静态变量被分配到同⼀块内存中,在以前的C语⾔中,全局变量和静态变量又分为初始化的和未初始化的,在C++里面没有这个区分,它们共同占⽤同⼀块内存区,在该区定义的变量若没有初始化,则会被自动初始化。

(5)常量存储区

        也被称为只读区,不允许修改,存储常量,如字符串常量等。

(6)代码区

        存放函数体的二进制代码。

堆和栈的区别?

  • 栈和堆都是用于存储程序数据的内存区域。
  • 栈是⼀种有限的内存区域,用于存储局部变量、函数调用信息等。堆是⼀种动态分配的内存区域,用于存储程序运⾏时动态分配的数据。
  • 栈上的变量生命周期与其所在函数的执行周期相同,而堆上的变量生命周期由程序员显式控制,分配(new 或 malloc)和释放( delete 或 free )。
  • 栈上的内存分配和释放是自动的,速度较快。堆上的内存分配和释放需要手动操作,速度相对较慢。

二、内存泄漏(memory leak)

1. 什么是内存泄漏?

        内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成内存的浪费。

        可以使用Valgrind、mtrace进行内存泄漏检测。

2. 内存泄漏有哪些类型?

(1)堆内存泄漏(Heap Leak)

        堆内存指的是程序运行中根据需要,通过malloc,realloc new等从堆中分配的一块内存,完成后必须通过调用对应的 free或者 delete 删掉。如果由于程序的设计错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生堆内存泄漏。

(2)系统资源泄漏(Resource Leak)

        主要指程序使用系统分配的资源比如 Bitmap,handle,SOCKET 等没有使用相应的函数释放掉,导致系统资源的浪费,严重可导致系统效能降低,系统运行不稳定。

(3)没有将基类的析构函数定义为虚函数

        当基类指针指向子类对象时,如果基类的析构函数不是 virtual,那么子类的析构函数将不会被调用,子类的资源没有正确释放,因此造成内存泄露。

3. 为什么会出现内存泄漏?

        指针指向改变,未释放动态分配内存。

4. 如何防止内存泄漏?

(1)采用RAII机制(Resource Acquisition Is Initialization),将内存的分配封装在类中,构造函数分配内存,析构函数释放内存;C++RAII机制-CSDN博客

(2)使用智能指针【面试八股总结】C++11新特性:智能指针-CSDN博客

三、内存管理方式

1. malloc和free

  • malloc:用于申请一块连续的指定大小的内存块区域,以void*类型返回分配的内存区域地址。
  • calloc:与malloc相似,但是calloc() 会将所分配的内存空间中的每一位都初始化为零
  • realloc: 给一个已经分配了地址的指针重新分配空间,可以做到对动态开辟内存大小的调整。
  • free:用来释放动态开辟的内存
void* malloc(size_t size);- 如果开辟成功,则返回一个指向开辟好的空间的指针- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查- 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
void free(void* ptr);- 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的- 如果参数ptr是NULL指针,则函数声明式什么都不做

2. new和delete

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

  • 注意:
    • 1. operator new和operator delete不是对new和delete的重载,是两个库函数。
    • 2. operator new实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。operator new本质是封装了malloc。operator delete本质是封装了free。

        申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[ ]和delete[ ]

  • 对内置类型

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

  • 对自定义类型

        new 调用operator new函数申请空间,在申请的空间上执行构造函数,完成对象的构造;

3. 区别

特征

new/delete

malloc/free

分配内存的位置

自由存储区

内存分配失败

抛出异常

返回NULL

分配内存的大小

编译器根据类型计算得出

显式指定字节数

处理数组

有处理数组的new版本new[]

需要用户计算数组的大小后进行内存分配

已分配内存的扩张

不支持

使用realloc完成

分配内存时内存不足

可以指定处理函数或重新制定分配器

无法通过用户代码进行处理

是否可以重载

可以

不可以

构造函数与析构函数

调用

不调用

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

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

相关文章

Postman下载及使用说明

Postman使用说明 Postman是什么? ​ Postman是一款接口对接工具【接口测试工具】 接口(前端接口)是什么? ​ 前端发送的请求普遍被称为接口 ​ 通常有网页的uri参数格式json/key-value请求方式post/get响应请求的格式json 接…

关闭Ubuntu烦人的apport

先来看让人绷不住的(恼) 我查半天apport是啥玩意发现就一错误报告弹窗,十秒钟给我弹一次一天给我内存弹爆了 就算我程序就算真的不停崩溃,也没你这傻比apport杀伤性强啊??? 原则上是不建议关闭…

牛客周赛 Round 51 解题报告 | 珂学家

前言 题解 典题场, EF都有很多种解法 A. 小红的同余 性质: 相邻两数互质 x ( m 1 ) / 2 x (m1)/2 x(m1)/2 m int(input())print ((m 1) // 2)B. 小红的三倍数 性质: 各个位数之和是3的倍数,可被3整除 和数的组合顺序无关 n int(input()) arr…

MySQL高级面试点

Explain语句结果中各个字段分别代表什么 id:查询语句没出现一个select关键字,MySQL就会给他分配一个唯一id select_type: select关键字对应哪个查询的类型 simple:简单的查询 不包含任何子查询 primary:查询中如果…

网络安全设备——EDR

网络安全中的EDR(Endpoint Detection and Response,端点检测与响应)是一种主动式的端点安全解决方案,它专注于监控、检测和响应计算机和终端设备上的安全威胁。以下是EDR的详细解释: 一、定义与功能 EDR是一种网络安…

repo sync同步出错解决

当出现下面提示时 e list of known hosts. Fetching: 100% (1167/1167), done in 44.619s info: A new version of repo is available warning: repo is not tracking a remote branch, so it will not receive updates Repo command failed: RepoUnhandledExceptionError …

Zabbix6.0使用自带模板(Redis by Zabbix agent 2)监控Redis数据库

注意:Zabbix6.0使用Redis by Zabbix agent 2 模板可直接监控Redis数据。 1、添加Redis账号密码信息(如果Redis没有设置密码可省略此步骤) vim zabbix_agent2.confPlugins.Redis.Sessions.redis.Uritcp://redis.huayunworld.com:6379 Plugins.Redis.Sessions.redis…

025-GeoGebra中级篇-曲线(1)_显式曲线、隐式曲线、参数曲线

写到曲线这一章节,不得不先梳理一下数学中关于曲线这一部分的内容,我们常见的曲线有显式曲线、隐式曲线、参数曲线,当然还有极坐标曲线、参数化曲面、分段函数曲线、分形曲线、复数平面上的曲线、随机曲线、和非线性动力系统的轨迹&#xff0…

在 PostgreSQL 里如何实现数据的分布式事务的回滚和补偿机制?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的分布式事务的回滚和补偿机制一、分布式事务的概念与挑战(一…

STM32智能农田监测系统教程

目录 引言环境准备智能农田监测系统基础代码实现:实现智能农田监测系统 4.1 数据采集模块 4.2 数据处理与分析模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:农田监测与管理问题解决方案与优化收尾与总结 1. 引言 智能农田监测系统通…

【LeetCode 链表合集】

文章目录 1. LeetCode 206 反转链表2. NC40 链表相加 1. LeetCode 206 反转链表 题目链接🔗 解题思路: 🔍 🐧创建一个新的节点,使用链表头插的方法; 2. NC40 链表相加 题目链接🔗 解题思路…

WPF MVVM框架 Caliburn.Micro的Action绑定

WPF MVVM框架 Caliburn.Micro的Action绑定 通过命名约定来绑定Action View <Window x:Class"WpfApp1.Views.AboutView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…

spring boot 基础特性

Spring Boot 特性&#xff1a; SpringBoot Starter&#xff08;场景启动器&#xff09;&#xff1a;将常用的依赖分组进行了整合&#xff0c;将其合并到一个依赖中&#xff0c;这样就可以一次性添加到项目的Maven或Gradle构建中。使编码变得简单&#xff0c;SpringBoot采用 Ja…

Django 删除所有数据

1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFiel…

论文翻译:Rethinking Interpretability in the Era of Large Language Models

https://arxiv.org/abs/2402.01761 在大型语言模型时代的可解释性再思考 摘要 在过去十年中&#xff0c;随着越来越大的数据集和深度神经网络的兴起&#xff0c;可解释机器学习领域的兴趣迅速增长。同时&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在广泛的任务中…

TypeScript 基础类型(一)

简介 它是 JavaScript 的超集&#xff0c;具有静态类型检查和面向对象编程的特性。TypeScript 的出现&#xff0c;为开发者提供了一种更加严谨和高效的开发方式。 主要特点&#xff1a; 、静态类型检查。 通过静态类型检查&#xff0c;开发者可以在编译时发现错误&#xff0…

QQ频道导航退出

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140413538 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Jquery常用操作汇总,dom操作,ajax请求

这段时间在写一些小Demo&#xff0c;用的都是很远古的Jquery,哈哈哈&#xff0c;但是呢也挺好玩儿的。想着记录一下。 题外话&#xff1a;补充一些自己欠缺的前端知识&#xff0c;&#xff08;我的前端学的比较乱&#xff0c;哈哈哈&#xff0c;原生的js不是很熟&#xff0c;&a…

链表的回文结构(链表的中间节点+反转链表)

链表的回文结构 一.链表的中间节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 二.返回倒数第k个节点思路1&#xff1a;暴力求解思路2&#xff1a;快慢指针 三.反转链表思路1&#xff1a;头插法思路2&#xff1a;反转指针的指向 四.链表的回文结构思路1&#xff1a;利…

「C++系列」一篇文章讲透【运算符】

文章目录 一、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 条件运算符&#xff08;三元运算符&#xff09;7. 成员访问运算符8. 指针和地址运算符9. 类型转换运算符10. 其他运算符 二、其他特殊运算符1. 成员访问运算符2. 指针和地址运算符3. 类…