常见内存泄漏场景与解决方案

news2024/12/24 2:34:08

服务器开发文章目录


文章目录

  • 服务器开发文章目录
  • 前言
  • 一、内存泄漏是什么?
  • 二、常见内存泄漏场景
  • 三、内存泄漏规避与定位
  • 总结


前言

作为C/C++程序员,谁还不写Bug,Bug中最常见要数内存泄漏、内存崩溃、死锁等问题,本文主要讲解内存泄漏问题,其具有其独有的属性,比如说:隐蔽性强、难以排查、占用资源不断累积等特点,当到达一定程度会出现崩溃、被系统kill掉等……
请添加图片描述


一、内存泄漏是什么?

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

二、常见内存泄漏场景

场景1:new/malloc与delete/malloc没有成对出现

void callfun(char *p)
{
	std::cout<< p<<std::endl; 
}
void fun()
{
	char *p = new char[128];
	return callfun(p);    
}

场景2:new/malloc 提前返回

void fun(std::string request)
{
	char *p = new char[128];
	if(request.length()== 0){
		return;
	}
	delete []p;
   	return;
}

场景3:基类被继承时,虚构函数没有被定义为virtual

class A
{
public:
	A(){}
	~A(){}      //未定义virutal
};
class B:public A
{
public:
	B(){
		p = new char[128];
	}
	~B(){
		if(p) delete [] p;
		p = nullptr;
	}
private:
	char *p = nullptr;
};

int main()
{
	A* inst = new B;
	...
	delete inst;
	return 0;
}

场景4:类对象通过shared_ptr<>相互引用

class A
{
public:
    A() {}
    ~A() {}
 publpic:
    int _data = 0;
    std::shared_ptr<A> _next;
}
int main()
{
	shared_ptr<A> n1(new A);
	shared_ptr<A> n2(new A);
	n1.get()->_next = n2;			// 代表深蓝色的线所做的事(n1结点的下一个指向n2)
	n2.get()->_next = n1;			// 代表浅蓝色的线所做的事(n2结点的下一个指向n1)
	return 0;
}

场景5:引用第三方接口分配资源,没有调用释放资源接口

char *mallocresource(int len);
void demallocresource(char *p)


int fun()
{
	char* p = mallocresource(100);
	//do something
	return 0;
}

场景6:未关闭文件句柄

int readFile()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL){
		perror("fopen");//输出错误原因,双引号里为要检查的函数
		return -1;
	}
	fseek(pf, 9, SEEK_SET);//文件指针偏移  SEEK_SET初始位置开始偏移
	int ch=fgetc(pf);        //SEEK_CUR  当前位置开始偏移
	printf("%c\n", ch);      //SEEK_END  末尾位置开始偏移
	return 0;
}

场景7:释放对象数组时在delete中没有使用方括号

class A
{
public:
	A(){
		p = new char[128];
	}
	~A(){
		if(p) delete p;
		p = nullptr;
	}
public:
	char *p;
};
int func()
{
	A* P = new A[100];
	delete p;
	return 0;
}

场景8:stl中value指针没有被delete释放

class A
{
public:
	A(){
	}
	~A(){
	}
};

std::map<std::string,A*> Avec;
void fun(){
	Avec.emplace("1",new A());
	***
	Avec.clear();
}

三、内存泄漏规避与定位

如何规避内存泄漏问题
1、通过智能指针来规避大部分内存泄漏问题
如何定位内存泄漏问题
1、通过代码打印,打桩封装malloc与free等接口,发现哪个模块没有内存分配没有成对(麻烦不推荐)
2、仔细评审两个版本间的代码差异,看看哪个地方疏忽等原因引入了内存泄漏,工作量打不推荐。
2、valgrind工具来定位、或asan工具等,细节略。


总结

通过上面的介绍,应该对常见的内存泄漏问题有了一点的了解,希望对你以后开发的过程中有所帮助。

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

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

相关文章

【Python表白系列】满屏飘字表白代码等你来取!(完整代码)

文章目录 环境需求完整代码详细分析系列文章环境需求 python3.12.0PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.…

汽车租赁小程序源码租车小程序

汽车租赁小程序&#xff0c;多门店租车小程序&#xff0c;本套系统分为用户端&#xff0c;门店管理端&#xff0c;总管理后台三部分。门店可以加盟入驻平台。可以源码&#xff0c;也可以二次开发&#xff0c;也可以定制开发。php开发语言&#xff0c;前端是uniapp。用户端是小程…

微软Microsoft二面面试题分享通过总结(不是标准答案分享

误打误撞 我写的shitty代码 当年面试算法开发岗竟然通过了 Background 先说下背景&#xff0c;软件工程本科毕业之后&#xff0c;当年8月到北欧读两年制硕士。面试发生在当年的11月&#xff0c;微软哥本哈根&#xff0c;location在丹麦的哥本哈根lingby&#xff08;是不是这么…

点赋网络:15秒快速新科技,重新定义新智能

随着科技的不断进步&#xff0c;自助设备在我们的生活中变得越来越常见。其中&#xff0c;智能饮品机作为一种方便快捷的购物方式&#xff0c;受到了广大消费者的喜爱。然而&#xff0c;以前的智能饮品机往往存在购物流程繁琐、速度缓慢等问题。现在&#xff0c;一种全新的智能…

Linux面试题精选:提升你的面试准备

大家有关于JavaScript知识点不知道可以去 &#x1f389;博客主页&#xff1a;阿猫的故乡 &#x1f389;系列专栏&#xff1a;JavaScript专题栏 &#x1f389;ajax专栏&#xff1a;ajax知识点 &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 学习…

canal环境部署

docker 部署canal同步数据 1 环境: 2 Mysql 配置 查看 binlog 是否启用 SHOW VARIABLES LIKE ‘%log_bin%’; 开启 binlog, 修改 my.cnf docker cp mysql:/etc/my.cnf /data/mysql/conf 拷贝文件到临时目录修改后再拷贝回去 # For advice on how to change settings please …

基于SSM框架的安全教育平台论文

基于SSM框架的安全教育平台 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了安全教育平台的开发全过程。通过分析安全教育平台管理的不足&#xff0c;创建了一个计算机管理安全教育平台的方案。文章介绍了安全…

代码上传的gitee平台

1.首先我们访问工作台 - Gitee.com进行注册和登录 2.我们创建一个仓库&#xff1a; 3.在本地创建我们的项目 在这文件夹里面我们打开git bush,执行 一下操作&#xff1a; git init &#xff1a;初始化仓库 git status&#xff1a;检查状态 git add . &#xff1a;将当前文件…

如何使用MySQL Workbench将样本数据库导入到MySQL数据库服务器

如何使用MySQL Workbench将样本数据库导入到MySQL数据库服务器 摘要&#xff1a;在本教程中&#xff0c;您将学习如何使用MySQL Workbench将MySQL样本数据库加载到MySQL数据库服务器。之后&#xff0c;您将有classicmodels示例数据库以方便练习和学习MySQL。 步骤1. 下载class…

Tomcat性能优化

Tomcat是一款常用的Java Web应用服务器&#xff0c;对其进行性能优化可以提高Web应用的响应速度和吞吐量。Tomcat性能取决于内存的大小。 增加JVM内存&#xff1a;在Tomcat的bin目录下的catalina.sh文件中修改JAVA_OPTS参数&#xff0c;将堆内存大小-Xmx和-Xms调整为适当的值。…

Win11如何找到电脑中的NVIDIA控制面板

目录 桌面任意地方右击&#xff0c;选择

Python生成器(Generator)(继续更新...)

学习网页&#xff1a; Welcome to Python.orghttps://www.python.org/https://www.python.org/ Python生成器 生成器&#xff08;Generator&#xff09;是 Python 的一种特殊类型的迭代器。生成器允许你创建自己的数据流&#xff0c;每次从数据流中获取一个元素&#xff0c;…

【已解决-实操篇】SaTokenException: 非Web上下文无法获取Request问题解决-实操篇

在上一篇《【理论篇】SaTokenException: 非Web上下文无法获取Request问题解决 -理论篇》中&#xff0c;凯哥(公众号&#xff1a;凯哥Java)介绍了了产生这个问题的源码在哪里&#xff0c;以及怎么解决的方案。没有给出实际操作步骤。 本文&#xff0c;凯哥就通过threadLocal方案…

SQL错题集3

1.薪水第二多的员工的emp_no以及其对应的薪水salary limit a,b 其中a表示查询数据的起始位置&#xff0c;b表示返回的数量。 &#xff08;MySQL数据库中的记录是从0开始的&#xff09; 注意从0开始 2.员工编号emp_no为10001其自入职以来的薪水salary涨幅值growth 聚合函数不能…

006 Windows共享

一、共享要求 一般是局域网内使用 1、物理上处于统一局域网 同一公司的网络同一家庭的网络连接同一手机热点的主机 2、逻辑上处于同一局域网 直接可以ping对方主机&#xff08;能够直接访问到&#xff09; 二、共享权限 1、共享权限 一般设置为everyone完全控制 2、NTF…

使用连接池对于feign的远程调用的优化

Feign底层发起http请求时&#xff0c;默认使用URLConnection发起http请求&#xff0c;不支持连接池操作&#xff0c;那么为了提高Feign的性能&#xff0c;可以采用的手段是使用连接池代替默认的URLConnection 支持连接池的http客户端 Apache HttpClientOKHttp本示例采用的是Apa…

continue语句

continue结束本次循环&#xff0c;接着判断下一次是否循环&#xff0c;我们上实例&#xff0c;用代码去理解continue 我们观察这个代码&#xff0c;会发现代码并没有终止运行&#xff0c;仅仅是把符合n%3的结果忽略掉了&#xff0c;后面的照常进行&#xff0c;直到for整个循环…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布

目录 一、实验 1.蓝绿发布准备 2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布 二、问题 1.手动构建Jenkins前端项目CI流水线报错 2.如何优化手动构建流水线选项参数 一、实验 1.蓝绿发布准备 &#xff08;1&#xff09;环境 表1 蓝绿发布…

python下载安装教程3.10.0,python下载安装教程3.9.7

这篇文章主要介绍了python下载安装教程3.10.0&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 前言 1、下载python 下载地址&#xff1a;https://www.python.org/&#xff0c;点…

NVIDIA A100 PCIE 40GB k8s-device-plugin install in kubernetes

文章目录 1. 目标2. 简介2.1 英伟达 A100 技术规格2.2 架构优势2.3 显卡跑分对比2.4 英伟达 A100 与 kubernetes 3. 安装 NVIDIA A100 GPU 40G 硬件4. NVIDIA R450 datacenter driver5. NVIDIA Container Toolkit6. 创建 runtimeclass5. MIG Strategies6. 配置仓库7. 下载镜像8…