什么是内存泄漏及如何防护内存泄漏
目录
- 前言
- 什么是内存泄漏
- 示例一
- 示例二
- 特殊版本
- 总结/结尾
前言
最近阅读量很低啊( ≧Д≦)
什么是内存泄漏
内存泄漏(Memory Leak)指在程序运行过程中,分配的内存空间在不再使用后未被正确释放或回收,导致这部分内存无法再被其他程序或操作系统使用,最终造成内存资源的浪费或不足。
当一个程序运行时,它需要在内存中分配一定的空间来存储数据和临时变量。
通常,在不再需要使用这些内存空间时,程序会将其释放给操作系统或其他程序使用。然而,如果程序中存在内存泄漏的问题,这些不再使用的内存空间将无法正确释放,导致内存的持续增加。
内存泄漏可能会导致以下问题:
- 内存资源浪费:未释放的内存占用会逐渐增加,最终占用过多的内存资源,导致系统整体性能下降。
- 系统崩溃或异常:当内存泄漏达到一定程度时,系统可能会因为内存不足而崩溃或出现异常错误。
- 系统性能下降:内存泄漏会导致资源的浪费,使得系统的响应速度变慢,甚至造成系统运行变得不稳定。
内存泄漏的常见原因包括未正确释放动态分配的内存、循环引用、缓存未清理等。内存泄漏可以通过使用合适的内存管理技术、编写高质量的代码以及使用内存分析工具来预防和修复。
示例一
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p;
p = (int*)malloc(sizeof(int) * 10);
//动态分配10个int类型变量的内存
//如果调用malloc函数失败,p会变成空指针,需要检查p是否为空指针再进行下一步操作
return 0;
}
讲解:
代码中的内存泄漏是指在malloc()
函数分配内存后,没有使用free()
函数释放该内存。由于没有释放这部分内存,在程序运行结束后,操作系统将无法回收这部分未释放的内存空间。
解决办法:
要解决这个问题,需要在不再使用动态分配的内存空间时,使用free()
函数将其释放。例如,在程序结束前添加free(p);
来释放p
指向的内存空间。
示例二
#include <stdio.h>
#include <stdlib.h>
void memoryLeak()
{
int *ptr = (int*)malloc(sizeof(int)); // 没有释放动态分配的内存,导致内存泄漏
// 这部分内存无法被其他程序或操作系统使用
}
int main()
{
memoryLeak();
printf("内存泄漏示例\n");
return 0;
}
讲解:
这段代码中,我们定义了一个名为memoryLeak()
的函数。在函数内部,我们使用malloc()
函数动态分配了一块int
类型的内存,并将其地址赋值给ptr
指针。但是,在函数结束之前,没有使用free()
函数释放这部分内存,导致内存泄漏的发生。
在main()
函数中,我们调用了memoryLeak()
函数,并在其后打印一条简单的消息。然而,由于存在内存泄漏问题,释放的内存无法被回收,这可能导致系统的内存资源被浪费,最终可能会导致系统性能下降或者崩溃。
解决办法:
应该在不再需要使用动态分配的内存时,使用free()
函数显式地释放内存,例如在memoryLeak()
函数末尾添加free(ptr);
语句。这样可以确保在不使用内存时能够释放它,避免内存泄漏问题的发生。
特殊版本
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int *)malloc(sizeof(int));
// 申请动态内存
*p = 123;
printf("*p = %d\n", *p);
// 输出 123
free(p);
// 释放内存
printf("*p = %d\n", *p);
// 错误: 程序运行错误(或者段错误)
return 0;
}
这段代码的功能是先通过malloc()
函数动态分配了一个int
类型大小的内存空间,并将其地址赋给指针变量p
。然后,将整数值123存储在该内存空间中,并通过printf()
函数打印出该值。
接下来,使用free()
函数释放了之前分配的内存空间。最后,在已经释放了内存空间的情况下,尝试使用指针p
访问该内存空间并打印其值。这是错误的行为,因为该内存空间已被释放,不再属于程序的可访问范围,因此会导致运行错误或段错误。
因此,代码的最后一行会导致程序出现错误。为了避免这种错误,应该在释放内存后避免继续使用指向已释放的内存地址的指针。
(如果看不懂看这里,说白了就是内存空间已经释放仍访问指针)
危害:
- 未定义的行为:尝试访问已释放的内存是未定义的行为。在这种情况下,代码中的
printf("*p = %d\n", *p);
语句会导致程序出现错误。这可能会导致程序崩溃或产生不可预测的行为。 - 内存泄漏:尽管在代码中使用了
free(p)
来释放内存,但是在释放之后仍然试图访问已释放的内存空间。这可能会导致内存泄漏,因为释放的内存无法被其他程序或操作系统回收,从而浪费内存资源。 - 安全隐患:如果被泄漏的内存中包含敏感数据,可能会导致安全隐患。其他恶意程序或黑客可能会利用这些被泄漏的内存来获取敏感信息,从而威胁系统的安全性。
总结/结尾
我准备用故事来讲的可我我没写脚本就更了这期文章
相关文章:
什么是内存泄漏及如何防护内存泄漏
目录 前言 什么是内存泄漏示例一示例二特殊版本 总结/结尾 前言 最近阅读量很低啊( ≧Д≦) 什么是内存泄漏 内存泄漏(Memory Leak)指在程序运行过程中,分配的内存空间在不再使用后未被正确释放或回收,导致这部分内存…...
【libuv】httpserver启用ssl 及 播放的日志打印
VLC vlc 第一次 接收不安全的证书黑屏。重启服务,再次vlc这次次好像就可以了。main debug: processing request item: zhangbin.flv, node: 播放列表, skip: 0 main debug: rebuilding array of current - root 播放列表 main debug: rebuild done - 2 items, index 1 main de…...

13、ffmpeg使用nvidia显卡对OAK深度相机进行解码和编码
基本思想:简单使用nvidia的硬件解码进行oak相机的编码和解码学习 一、在本机rtx3060配置好显卡驱动和cuda之后进行下面操作50、ubuntu18.04&20.04CUDA11.1cudnn11.3TensorRT7.2/8.6Deepsteam5.1vulkan环境搭建和YOLO5部署_ubuntu18.04安装vulkan_sxj731533730的…...

自动化测试如何做?搭建接口自动化框架从0到1实战(超细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 传统软件测试行业…...

安装Python之后 安装库报错 There was an error checking the latest version of pip.
报错代码 & 图片如下 Looking in indexes: https://pypi.tuna.tsicmdnghua.edu.cn/simple WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HT…...

"科技与狠活"企业级无代码开发MES系统,一周实现数字化
随着科技的不断发展,企业级无代码开发平台成为了一种新型的解决方案,能够有效降低软件开发门槛,提升开发效率。在制造业领域,MES系统(Manufacturing Execution System)作为一种关键的生产管理工具ÿ…...

超实用的品牌软文推广方案分享,纯干货
品牌软文推广对于企业来说是一项关键且重要的战略,如何通过软文推广提高品牌的知名度、美誉度和影响力,成为了许多企业关注的问题。本文伯乐网络传媒将从多个角度深度探讨品牌软文推广方案,为企业提供一些有价值的参考。 一、确定品牌软文推广…...
网络安全(黑客)8大工具
1.Nmap 它是网络管理员 必用的软件之一,以及用以评估网络系统安全。正如大多数被用于网络安全的工具,nmap 也是不少黑客及骇客(又称脚本小子 )爱用的工具 。系统管理员可以利用nmap来探测工作环境中未经批准使用的服务器ÿ…...
重启Linux服务器 Oracle 数据库步骤
在一次重启数据库的时候,没有正确按照步骤重启数据库,导致服务器重启。 正确步骤及详解: (1) su - oracle 打开Xshell,连接到数据库所在的linux机器。若用户为root,请输入命令“su - oracle”并回车,若要…...

kaggle新赛:Bengali.AI 语音识别大赛赛题解析
赛题名称:Bengali.AI Speech Recognition 赛题链接:https://www.kaggle.com/competitions/bengaliai-speech 赛题背景 竞赛主办方 Bengali.AI 致力于加速孟加拉语(当地称为孟加拉语)的语言技术研究。Bengali.AI 通过社区驱动的…...
解放Linux内存:释放缓存(linux释放缓存)
随着软件越来越复杂,内存变得越来越宝贵。尤其是在Linux系统上,内存管理策略十分重要。它不仅可以帮助系统保持高效运行,而且也能够让程序有更多的空间来运行,避免系统出现假死和其他性能问题。 在Linux系统中,释放缓…...

前端跨域解决方案
跨域 同源指的是两个URL的协议、域名、端口号一致,反之则是跨域。 出现跨域的根本原因:浏览器的同源策略不允许非同源的URL之间进行资源的交互。 同源策略限制为以下几种行为: Cookie、LocalStorage和IndexDB无法获取。DOM和JS对象无法获得…...

脚手架(vue-cli)的安装详细教程
首先要下载node.js 下载 | Node.js 中文网 (nodejs.cn)https://nodejs.cn/download/ 大家根据自己的系统来选择哪个,我是Windows系统,所以选择红色箭头所指的安装包去安装!!! 接下来双击安装!!…...

yolov5 onnx模型 转为 rknn模型
1、转换为rknn模型环境搭建 onnx模型需要转换为rknn模型才能在rv1126开发板上运行,所以需要先搭建转换环境 模型转换工具 模型转换相关文件下载: 网盘下载链接:百度网盘 请输入提取码 提取码:teuc 将其移动到虚拟机中…...

Mybatis-Flex
一、Mybatis-Flex是什么? Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时…...

C++ | 红黑树以及map与set的封装
目录 前言 一、红黑树 1、红黑树的基本概念 2、红黑树相关特性 3、红黑树结点的定义 4、红黑树的查找 5、红黑树的插入 6、二叉树的拷贝构造与析构 7、红黑树的检测 8、红黑树总结 二、map与set的封装 1、红黑树的结点 2、红黑树迭代器 3、set的封装 4、map的封…...

逻辑斯特回归
*分类是离散的,回归是连续的 下载数据集 trainTrue:下载训练集 逻辑斯蒂函数保证输出值在0-1之间 能够把实数值映射到0-1之间 导函数类似正态分布 其他饱和函数sigmoid functions 循环神经网络经常使用tanh函数 与线性回归区别 塞戈马无参数&#x…...
OpenCV 算法解析
opencv大坑之BGR opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记! #opencv读入的矩阵是BGR,如果想转为RGB,可以这么转 img4 cv2.imread(1.jpg) img4 cv2.cvtColor(img4,cv2.COLOR_BGR2RGB) OpenCV 常见…...

springboot创建并配置环境(一) - 创建环境
文章目录 一、介绍二、启动环境Environment的分析三、进入源码四、创建环境1. 如何确定应用类型2. 测试 一、介绍 在springboot的启动流程中,启动环境Environment是可以说是除了应用上下文ApplicationContext之外最重要的一个组件了,而且启动环境为应用…...

2023JAVA 架构师面试 130 题含答案:JVM+spring+ 分布式 + 并发编程》...
此文包含 Java 面试的各个方面,史上最全,苦心整理最全 Java 面试题目整理包括基JVM算法数据库优化算法数据结构分布式并发编程缓存等,使用层面广,知识量大,涉及你的知识盲点。要想在面试者中出类拔萃就要比人付出更多的…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...