当前位置: 首页 > news >正文

【C++】-- 内存泄漏

目录

内存泄漏

内存泄漏分类

如何检测内存泄漏

如何避免内存泄漏


内存泄漏

#问:什么是内存泄漏?
        内存泄漏:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费
一句话:

        内存泄漏通常是因为我们的疏忽,或者是一些程序的错误,而导致不再使用的内存没有释放。

(错误如:抛出的异常所导致,new的空间并未进行delete)

void MemoryLeaks()
{// 1.内存申请了忘记释放int* p1 = (int*)malloc(sizeof(int));int* p2 = new int;// 2.异常安全问题int* p3 = new int[10];Func(); // 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.delete[] p3;
}
#问:内存泄漏是指针丢了还是内存丢了?
        是指针丢了,因为如果指针没有丢就不存在内存泄漏。,因为只要指针没有丢我们就还可以进行释放。
        内存会丢?是并不会的!内存都在进程地址空间的位置,Linux下进程地址空间还会根据页表结构然后与物理内存进行映射。它是一直都在那个位置,只是因为它的指针被我们所搞丢了,从而导致我们不用了,但是想释放都释放不了。于是系统以为我们在使用,而我们没有在使用,并且一直不会使用,于是内存泄漏,可用内存越来越少。
        内存还在,进程正常结束,内存也会释放
#问:内存泄漏有什么危害?
        内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
  • 僵尸进程:

        僵尸进程有内存泄漏,因为是僵尸进程,所以进程没有正常的释放,正常的结束,于是资源没有的得到释放。僵死进程的内核栈无法被释放掉(1K 或者 2K大小),因为在栈的最低端,有着thread_info结构,它包含着 struct_task 结构,这里面包含着一些退出信息。这个时候僵尸进程非常的多,系统就会越来越慢。

  • 长期运行:

        虽然进程结束,内存泄漏就会释放,但是有一些进程是会长期运行的。最怕的就是一次只会泄漏一点点,这样的泄漏在长期的运行下就会凸显出来。

内存泄漏分类

C/C++程序中一般我们关心两种方面的内存泄漏:

  • 堆内存泄漏(Heap leak)
        堆内存指的是程序执行中依据须要分配通过malloc / calloc / realloc / new等从堆中分配的一块内存,用完后必须通过调用相应的 free或者delete 删掉。假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak。
  • 系统资源泄漏
        指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

如何检测内存泄漏

linux下内存泄漏检测:linux下几款内存泄漏检测工具
windows下使用第三方工具:VLD工具说明
其他工具:内存泄漏工具比较

如何避免内存泄漏

  • 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。

        ps:这个理想状态。但是如果碰上异常时,就算注意释放了,还是可能会出问题。需要下一条智能指针来管理才有保证。

  • 采用RAII思想或者智能指针来管理资源。
  • 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项

        ps:检测工具的内部实现原理,申请内存用一个容器记录下来,释放内存时从容器中删除掉。程序结束前,或者没有任何任务时,容器中的资源可能就是内存泄漏的。

  • 出问题了使用内存泄漏工具检测。

        ps:不过很多工具都不够靠谱,或者收费昂贵。

总结: 
内存泄漏非常常见,解决方案分为两种:
  • 事前预防型,如:智能指针等。(打疫苗)
  • 事后查错型,如:泄漏检测工具。(做核酸)

相关文章:

【C++】-- 内存泄漏

目录 内存泄漏 内存泄漏分类 如何检测内存泄漏 如何避免内存泄漏 内存泄漏 #问:什么是内存泄漏?内存泄漏:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某…...

C++ STL学习之【string类的模拟实现】

✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 The key is to keep company only with people who uplift you, whose presence calls forth your best. 关键是只与那些提升你的人在一起&#xff0c…...

Selenium基于POM的自动化测试实践

什么是Page Object模式 Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。在实际自动化测试实战过程中,我们一般对脚本的实现分为三层: (1)对象层: 用于存放页面元素定位和控件操作 (2)逻…...

记录每日LeetCode 2373.矩阵中的局部最大值 Java实现

题目描述: 给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal ,并满足: maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说,我们希…...

QT中级(6)基于QT的文件传输工具(2)

QT中级(6)基于QT的文件传输工具(2)本文实现第一步1 新增功能2 运行效果3 实现思路4 源代码实现这个文件传输工具大概需要那几步?实现多线程对文件的读写实现TCP客户端和服务端实现网络传输 书接上回:QT中级…...

【Linux】工具(3)——gcc/g++

咱们继续进阶,接下来进入到Linux工具中gcc和g的学习在本章博客正式开始介绍之前,我们先要弄清楚程序是怎么翻译的:C语言程序环境一、什么是gcc/g📌gcc是一个c编译器, g是c编译器。我们根据代码的后缀名来判断用哪个编译…...

Android文件选择器

使用方法:在里层的build.grade的dependency里面加入: implementation com.leon:lfilepickerlibrary:1.8.0 引用https://github.com/leonHua/LFilePicker/blob/master/README_CH.md#lfilepicker LFilePicker 说明:如果发现应用名称被修改,可以参考issues#26 查看解决方案,或…...

《MySql学习》 Select 查询语句慢的非性能原因

一.查询被阻塞 A会话执行 查询操作,长时间没有返回信息,此时我们就可以去排查一下是否是被阻塞了 select * from words 被阻塞的原因有很多,首先列举第一种情况 1.等MDL锁 当我们执行DDL语句时,会自动给表加上MDL写锁。当执行DML和DQL时&…...

Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)

一、父传子、父传后代 方式一&#xff1a;子通过props来接收 父组件&#xff1a;父组件引入子组件时&#xff0c;通过<child :parentValue "parentValue"></child>子组件传值。 备注&#xff1a;这种方式父传值很方便&#xff0c;但是传递给后代组件不…...

【ES】Elasticsearch-深入理解索引原理

文章目录Elasticsearch-深入理解索引原理读操作更新操作SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并近实时搜索&#xff0c;段数据刷新&#xff0c;数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间Elasticsearch-深入理解…...

pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?

大家在存储文件时&#xff0c;通常会遇到一些较大的文件&#xff0c;这时需要对其进行压缩处理。下面介绍一下如何压缩PDF文件大小以及批量转换Word文件为PDF格式。pdf压缩文件大小的方法是什么?1.打开小圆象PDF转换器&#xff0c;选择“PDF压缩”功能。2.在“PDF压缩”界面中…...

论文阅读——FECANet:应用特征增强的上下文感知小样本语义分割网络

代码&#xff1a;NUST-Machine-Intelligence-Laboratory/FECANET (github.com) 文章地址&#xff1a;地址 文章名称&#xff1a;FECANet: Boosting Few-Shot Semantic Segmentation with Feature-Enhanced Context-Aware Network 摘要 Few-shot semantic segmentation 是学习…...

数组模拟常见数据结构

我们来学习一下用数组模拟常见的数据结构&#xff1a;单链表&#xff0c;双链表&#xff0c;栈&#xff0c;队列。用数组模拟这些常见的数据结构&#xff0c;需要我们对这些数据结构有一定的了解哈。单链表请参考&#xff1a;http://t.csdn.cn/SUv8F 用数组模拟实现比STL要快&a…...

ADC0832的AD模数转换原理及编程

✅作者简介&#xff1a;嵌入式领域优质创作者&#xff0c;博客专家 ✨个人主页&#xff1a;咸鱼弟 &#x1f525;系列专栏&#xff1a;单片机设计专栏 &#x1f4c3;推荐一款求职面试、刷题神器&#x1f449;注册免费刷题 目录 一、描述 二、模数转换原理&#xff1a; 三、…...

【工具插件类教学】UnityPackageManager私人定制资源工具包

目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …...

【软件测试】2023年了还不会接口测试?老鸟总结接口测试面试谁还敢说我不会......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试面试&#xff0…...

类Vuex轻量级状态管理实现

引用自 摸鱼wiki 1. vuex vuex是一个前端广泛流行的状态管理库&#xff0c;主要由以下几大模块组成&#xff1a; state&#xff1a;状态存储getter&#xff1a;属性访问器mutation&#xff1a;可以理解为一个同步的原子性事务&#xff0c;修改state状态action&#xff1a;触发…...

Java 基本数据类型

Java基本数据类型是Java编程语言中最基本的数据类型&#xff0c;包括整型、浮点型、字符型、布尔型和空类型。本文将详细介绍Java基本数据类型的作用和在实际工作中的用途。 整型&#xff08;int、long、short、byte&#xff09; 整型是Java中最常见的基本数据类型&#xff0…...

全网资料最全Java数据结构与算法-----算法分析

算法分析 研究算法的最终目的就是如何花更少的时间&#xff0c;如何占用更少的内存去完成相同的需求&#xff0c;并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异&#xff0c;但我们并不能将时间占用和空间占用量化&#xff0c;因此&#xff0c;接下来我们要学习…...

【封装xib补充 Objective-C语言】

一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…...

告别臃肿控制中心,拥抱开源替代方案:G-Helper硬件调校效率提升指南

告别臃肿控制中心&#xff0c;拥抱开源替代方案&#xff1a;G-Helper硬件调校效率提升指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and…...

如何用res-downloader解决多平台资源下载难题:从入门到精通

如何用res-downloader解决多平台资源下载难题&#xff1a;从入门到精通 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcod…...

别再只卷CNN了!用强化学习(RL)给YOLOv5打个辅助,实现工业零件精准定位(附PyTorch代码)

强化学习与YOLOv5的协同优化&#xff1a;工业零件精准定位实战指南 工业质检领域对目标检测的精度要求近乎苛刻——0.1毫米的定位偏差可能导致整个批次的报废。当传统YOLOv5在复杂场景下遇到瓶颈时&#xff0c;强化学习(RL)的决策能力可以成为突破精度天花板的关键辅助。本文将…...

基于Proteus与51单片机的智能交通灯系统仿真设计

1. 智能交通灯系统设计概述 红绿灯控制系统是城市交通管理的基础设施&#xff0c;传统固定时长的红绿灯已经无法满足现代交通需求。使用51单片机和Proteus仿真软件搭建智能交通灯系统&#xff0c;不仅能帮助理解嵌入式系统开发流程&#xff0c;还能为实际硬件开发打下基础。这个…...

从H5到uni-app:迁移‘滚动菜单高亮’功能时,我踩过的3个关键差异点

从H5到uni-app&#xff1a;迁移滚动菜单高亮功能的三大思维转换 第一次在uni-app里实现滚动菜单高亮效果时&#xff0c;我差点把键盘摔了——那些在H5里信手拈来的document.querySelector和window.scrollY突然全部失效。这就像习惯右手写字的人突然被要求用左手&#xff0c;明明…...

解锁Dify工作流新潜能:四种并行模式实战解析

1. 为什么需要工作流并行化&#xff1f; 第一次用Dify构建工作流时&#xff0c;我就被它的可视化编排能力惊艳到了。但实际跑了几次发现&#xff0c;当处理复杂任务时&#xff0c;串行执行就像在高速公路上开拖拉机——明明有八车道却只开放一条。比如做新闻情感分析时&#xf…...

SAC算法实战:用PyTorch实现自动驾驶控制(附完整代码)

SAC算法实战&#xff1a;用PyTorch构建自动驾驶控制系统 在自动驾驶技术快速发展的今天&#xff0c;强化学习已成为解决复杂决策问题的有力工具。而Soft Actor-Critic&#xff08;SAC&#xff09;算法凭借其在连续动作空间中的卓越表现&#xff0c;正在成为自动驾驶控制领域的新…...

终极免费方案:3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用

终极免费方案&#xff1a;3分钟掌握ViGEmBus虚拟游戏手柄驱动的完整部署与应用 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾为游戏不支持你的手柄…...

OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制

OpenClaw故障自愈方案&#xff1a;百川2-13B模型异常日志分析与重试机制 1. 问题背景与需求场景 上周我在用OpenClaw对接百川2-13B模型处理夜间自动化任务时&#xff0c;遇到了一个典型问题&#xff1a;凌晨3点突然收到飞书告警&#xff0c;显示"模型响应超时"。当…...

【2026 Python并发新纪元】:从asyncio到subinterpreters再到Rust-Python混合调度——全栈工程师必须掌握的4层无锁架构

第一章&#xff1a;Python无锁GIL环境的范式革命传统CPython解释器受全局解释器锁&#xff08;GIL&#xff09;制约&#xff0c;即使在多核CPU上也无法实现真正的并行字节码执行。近年来&#xff0c;随着PyPy的STM分支、RustPython的无GIL设计&#xff0c;以及CPython官方在PEP…...