C++(11)——内存管理

C++内存分布

我们先看一段代码以及相关问题。

这道题的答案是多少呢?

答案在这里哦,看一下有没有问题呀。如果这么简单的题做错了,怕不是要被电击一下。

C++内存管理方式

我们知道C语言中动态内存管理的方式是 malloc realloc calloc free 这几个函数。

在C++中,C语言的这些方式可以继续使用,但有些地方就有点无能为力了,而且使用起来比较麻烦。C++提出了自己的内存管理方式:通过new 和 delete 操作符进行动态内存管理。

new/delete操作内置类型

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]。一定要匹配起来使用。

new/delete操作自定义类型

注意:new和delete对于自定义类型,除了开辟空间和释放空间,也会调用构造函数和析构函数。

operator new 和 operator delete

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

operator new:该函数实际上是通过malloc来申请的空间。

operator delete:该函数实际上是通过free来释放空间的。

所以,new的原理就是 new调用 operator new ,然后operator new通过malloc来申请空间。

delete同理

定位new表达式

定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象。

格式:new(place_address) type 或者 new(place_address) type(initializer_list)

其中 place_address必须是一个指针, initializer_list是类型的初始化列表。

使用场景:

定位new配合内存池使用。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示构造函数进行初始化。(这个先了解,后面会提到的)。

内存泄漏

内存泄漏

内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现
内存泄漏会导致响应越来越慢,最终卡死。

内存泄漏分类

一般分为两类:堆内存泄露和系统资源内存泄漏

堆内存泄露:堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一 块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak

系统资源内存泄漏:指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

如何避免内存泄漏

1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。 ps : 这个理想状态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智 能指针来管理才有保证。
2. 采用 RAII 思想或者智能指针来管理资源。
3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。
4. 出问题了使用内存泄漏工具检测。 ps :不过很多工具都不够靠谱,或者收费昂贵。

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

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

相关文章

嵌入式学习第三篇——51单片机

目录 1,嵌入式系统 1,嵌入式系统的定义 2,单片机的定义 2,51单片机 1,开发环境 2,开发板使用的基本思路 1,查看原理图,查看芯片手册 2,获得调用硬件的管…

【js逆向】scrapy基础

目录 一, 爬虫工程化 二, scrapy简介 三, Scrapy工作流程(重点) 四, scrapy安装 4.1 pip 安装 4.2 wheel安装 五, Scrapy实例 六, 自定义数据传输结构item 七, scrapy使用小总结 一, 爬虫工程化 在之前的学习中我们已经掌握了爬虫这门技术需要的大多数的技术点, 但是我…

OpenCV学习记录——形态学处理

文章目录 前言一、腐蚀和膨胀二、高级形态学运算三、具体应用代码 前言 形态学是图像处理中最常用的技术之一,它主要用于从图像中提取有意义的形状信息,例如边界和连通区域,以便后续的识别工作能够捕捉到目标对象最重要的形状特征。此外&…

车载测试Vector工具CANoe——常见问题汇总(下)

车载测试Vector工具CANoe——常见问题汇总(下) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一…

elementUI中el-tree组件单选没有复选框时,选中、current-node-key高亮、刷新后保留展开状态功能的实现

目录 一、代码实现1. 属性了解 ([更多](https://element.eleme.cn/#/zh-CN/component/tree))2. 实现步骤3.代码示例 二、 效果图 一、代码实现 1. 属性了解 (更多) node-key 每个树节点用来作为唯一标识的属性,整棵树…

发布5-JRT在Linux开发

JRT作为全信创支持的架构,设计之初就是计划完全能脱离Win开发和运行的,设计目标不仅仅是发布程序能脱Win,开发自己也要能脱Win。那么就不能依赖一些只能在Windows下运行或者好使的工具。JRTClient基于javafx开发、JRTBrowser基于Electron开发…

List集合接口的介绍和使用

一.关于List集合类的继承关系图 List接口继承了Collection接口,而List接口下有三个重要的实现类:ArrayList,LinkedList,Vector 二.List接口的基本介绍 1.List接口是Collection接口的子接口2.存入List集合中的元素是有序的(即添加…

SVDiff: Compact Parameter Space for Diffusion Fine-Tuning——【论文笔记】

本文发表于ICCV 2023 论文地址:ICCV 2023 Open Access Repository (thecvf.com) 官方代码:mkshing/svdiff-pytorch: Implementation of "SVDiff: Compact Parameter Space for Diffusion Fine-Tuning" (github.com) 一、Introduction 最近几…

Xmind 2023 下载安装教程,保姆级教程,小白也能轻松搞定,附安装包

前言 XMind 是一款非常实用的思维导图软件,应用全球最先进的Eclipse RCP 软件架构,全力打造易用、高效的可视化思维软件,强调软件的可扩展、跨平台、稳定性和性能,致力于使用先进的软件技术帮助。 准备工作 1、Win7 及以上系统…

支付宝直连商户处理支付交易投诉管理,支持多商户

大家好,我是小悟 1、问题背景 玩过支付宝生态的,或许就有这种感受,如果收到投诉单,不会通知到手机端,只会在支付宝商家后台-账号中心-安全中心-消费者投诉-支付交易投诉那里显示。那你能一直盯着电脑看吗?…

STL——空间配置器

空间配置器是STL六大组件之一,它和其他五个组件相互配合,起着很关键的作用。 容器:各种数据结构、如vector、list、stack、deque、queue、set、map、unordered_map等等算法:各种算法,如sort、serach、copy、erase 提供…

LED点阵屏(基于51单片机)

师从江科大 LED点阵屏 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 LED点阵屏分类 按颜色:单色、双色、全彩 按像素:8*8、16*16等(大规模的LED点阵通常由很多个…