《C语言杂记》C语言内存泄露分析与检测

1 内存泄露分析

在堆上分配的内存,没有及时释放掉,以便后面其它地方可以重用。在C/C++中,内存管理器不会帮你自动回收不再使用的内存。如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露。

一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃。
内存访问越界,使用的内存超出了向系统申请了一块内存,覆盖该空间之后的一段存储区域,导致系统异常。

常见原因:
1.写越界,又叫缓冲区溢出,所写入的数据对别人来说是随机的,它也会产生不可预料的后果。
向10个字节的数组写入了20个字节;内存操作越界。
如char szText[10];memset(szText,0,30); //访问越界了,10字节空间,修改了30字节

2.读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。

内存越界访问造成的后果非常严重,是程序稳定性的致命威胁之一。更麻烦的是,它造成的后果是随机的,表现出来的症状和时机也是随机的,让BUG的现象和本质看似没有什么联系,这给BUG的定位带来极大的困难。

一些工具可以够帮助检查内存越界访问的问题,但也不能太依赖于工具。内存越界访问通常是动态出现的,即依赖于测试数据,在极端的情况下才会出现,除非精心设计测试数据,工具也无能为力。工具本身也有一些限制,甚至在一些大型项目中,工具变得完全不可用。比较保险的方法还是在编程是就小心,特别是对于外部传入的参数要仔细检查。

2 内存泄漏检测工具Valgrind的安装与使用

Valgrind是一个Linux平台的内存调试工具。它允许你在Valgrind自己的环境中运行你的程序,监视内存使用,例如:调用malloc和free(或者是C++中的new和delete)。如果使用未初始化的内存,数组访问越界或者忘记释放指针,Valgrind就能够检测出来。使用valgrind之前 ,当然是要拥有它了。

2.1 Valgrind的安装

Valgrind地址:https://valgrind.org/downloads/current.html
Valgrind可以在线安装,当然也可以使用源码安装。

如果你是Ubuntu系统,直接使用以下命令安装Valgrind即可。

$sudo snap install valgrind # version 3.21.0, or
$sudo apt install valgrind # version 1:3.15.0-1ubuntu9.1

Valgrind最新的版本是V3.21.0,直接下载valgrind-3.21.0.tar.bz2压缩包进行源码安装。
$tar -xvf valgrind-3.21.0.tar.bz2
$./configure --prefix=/usr/local/valgrind
$make
$sudo make install

使用以上命令,valgrind就安装在你的系统里面了,不管使用在线安装还是源码安装只要能安装上Valgrind就行。

2.2 valgrind的使用

valgrind能够发现使用非法的堆内存。下面就使用valgrind来查看内存泄漏。

#include <stdlib.h>void fun(void)
{int* x = malloc(10 * sizeof(int));x[10] = 0;        // problem 1: heap block overrun
}                      // problem 2: memory leak -- x not freedint main(void)
{fun();return 0;
}

$ gcc main.c -g -o main
值得注意的是,变异需要加-g参数。
$ valgrind --tool=memcheck --leak-check=full ./main

==4813== Memcheck, a memory error detector
==4813== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==4813== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==4813== Command: ./main
==4813== 
==4813== Invalid write of size 4
==4813==    at 0x10916B: fun (main.c:6)
==4813==    by 0x109180: main (main.c:11)
==4813==  Address 0x4a50068 is 0 bytes after a block of size 40 alloc'd
==4813==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==4813==    by 0x10915E: fun (main.c:5)
==4813==    by 0x109180: main (main.c:11)
==4813== 
==4813== 
==4813== HEAP SUMMARY:
==4813==     in use at exit: 40 bytes in 1 blocks
==4813==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==4813== 
==4813== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==4813==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==4813==    by 0x10915E: fun (main.c:5)
==4813==    by 0x109180: main (main.c:11)
==4813== 
==4813== LEAK SUMMARY:
==4813==    definitely lost: 40 bytes in 1 blocks
==4813==    indirectly lost: 0 bytes in 0 blocks
==4813==      possibly lost: 0 bytes in 0 blocks
==4813==    still reachable: 0 bytes in 0 blocks
==4813==         suppressed: 0 bytes in 0 blocks
==4813== 
==4813== For lists of detected and suppressed errors, rerun with: -s
==4813== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)

可以看到有对泄漏信息进行检测,有两个错误,并且指出产生泄漏的代码及代码行数。

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

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

相关文章

栈OJ(C++)

文章目录 1.最小栈2.栈的压入、弹出序列3.逆波兰表达式&#xff08;后缀表达式&#xff09;求值3.1后缀表达式求值3.2中缀表达式转后缀表达式3.3带有括号的中缀表达式转后缀表达式 1.最小栈 class MinStack { public:MinStack(){}void push(int val){_st.push(val);//empty放在…

7.23 校招实习内推 面经

1、半导体芯片一周资讯 - 英特尔全球裁员1.2万人&#xff0c;台积电3纳米良率仅为55% &#xff0c;马斯克特斯拉正自研芯片 但不会称作GPU 半导体芯片一周资讯 - 英特尔全球裁员1.2万人&#xff0c;台积电3纳米良率仅为55% &#xff0c;马斯克特斯拉正自研芯片 但不会称作GPU …

【kafka调试】用命令行查看kafka是否发出了命令

server 10.10.90.210:9092 topic stream_manager_center_capture_file 摄像头id&#xff1a; 17283ed2a1ac685f9fd5ef9f0de04792 cd /usr/loca/kafka bin/kafka-console-consumer.sh --bootstrap-server 10.10.90.210:9092 --topic stream_manager_center_capture_file 然后添…

<C语言> 数据在内存中的存储

1.数据类型介绍 C语言中的基本内置类型如下&#xff1a; char //字符数据类型 short //短整型 int //整型 long //长整型 long long //更长的整型 float //单精度浮点数 double //双精度浮点数类型的意义&#xff1a; 1.使用这个类…

设计模式-抽象工厂模式

在经济学领域中&#xff0c;其主要研究对象(商品)之间根据消费依存关系可分为互补商品或替代商品&#xff0c;其中&#xff0c;互补商品如汽车与汽油、自行车与自行车胎、大饼和香肠、开水和泡面等。在面向对象的代码世界中&#xff0c;不同对象之间也存在这种类似相互依赖的关…

使用 ChatGPT 碰到的坑

最近在使用 ChatGPT 的时候碰到一个小坑&#xff0c;因为某些特殊情况我需要使用 syslog 向 logbeat 中发送日志。 由于这是一个比较古老的协议&#xff0c;确实也没接触过&#xff0c;所以就想着让 ChatGPT 帮我生成个例子。 原本我已经在 Go 中将这个流程跑通&#xff0c;所…

RocketMQ集成Springboot --Chapter5

RocketMQ tag过滤和sql92语法过滤 tag过滤 生产者&#xff0c;由于springboot没有专门对mq进行tag标记的方法&#xff0c;只是在topic:后面加上&#xff0c;所以只需 rocketMQTemplate.sendOneWay(“tagFilterBoot:TagA”,msg1);标记即可 生产者代码如下 /***生产者* tag过滤*…

PyTorch从零开始实现Transformer

文章目录 自注意力Transformer块编码器解码器块解码器整个Transformer参考来源全部代码&#xff08;可直接运行&#xff09; 自注意力 计算公式 代码实现 class SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, self).__init__()self.e…

Windows Spark 开发测试版本快速搭建

1、Spark 包下载 清华大学开源软件镜像站下载(速度较快&#xff0c;但版本不全)官方各个版本 下载后解压即可。 &#xff08;可选&#xff09;添加环境变量 SPARK_HOME。并将 %SPARK_HOME%/bin、%SPARK_HOME%/sbin 添加到 path 中。 ps&#xff1a;本文使用的是 spark-3.3.0…

【unity】RectTransform与Transform组件有什么区别

RectTransform组件是Unity中用于控制UI元素位置、大小和旋转的组件。它是UI系统的一部分&#xff0c;用于在屏幕空间中布局和定位UI元素。 与transform组件相比&#xff0c;RectTransform组件具有以下区别&#xff1a; 1. 坐标系统&#xff1a;RectTransform组件使用屏幕空间坐…

线上问题排查-dubbo-Dubbo client can not supported string message

1.问题描述 线上值班时&#xff0c;收到告警通知dubbo 调用异常。 主要报错包括下面两条记录&#xff1a; [DUBBO] Dubbo client can not supported string message: [ERROR] [New I/O client worker #1-3] com.alibaba.dubbo.remoting.transport.AbstractCodec - Data len…

一起学SF框架系列5.8-spring-Beans-Bean注解解析3-解析配置component-scan

本文主要讲述Spring是如何解析“context:component-scan”元素&#xff0c;扫描加载目录下的BeanDefinition。 解析内容 1、解析的元素如下&#xff1a; <!-- 注解模式&#xff1a;配置bean扫描路径&#xff08;注&#xff1a;自动包含子路径&#xff09; --><conte…

SpringAOP面向切面编程 通知类型

一、通知类型 Around&#xff1a;环绕通知&#xff0c;此注解标注的通知方法在目标方法前、后都被执行 Before&#xff1a;前置通知&#xff0c;此注解标注的通知方法在目标方法前被执行 After&#xff1a;后置通知&#xff0c;此注解标注的通知方法在目标方法后被执行&…

Linux-tomcat环境搭建、jpress部署实践、nginx反向代理

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

分类评估指标

文章目录 1. 混淆矩阵2. Precision(精准率)3. Recall(召回率)4. F1-score5. ROC曲线和AUC指标5.1 ROC 曲线5.2 绘制 ROC 曲线5.3 AUC 值6. API介绍6.1 **分类评估报告api**6.2 **AUC计算API**练习-电信客户流失预测1. 数据集介绍2. 处理流程3. 案例实现4. 小结1. 混淆矩阵

ElasticSearch学习--RestClient及案例

目录 RestClient查询文档 快速入门 总结 全文检索&#xff08;match&#xff09;查询 精确查询 复合查询 查询总结 排序&#xff0c;分页 高亮 RestClient查询文档 快速入门 总结 全文检索&#xff08;match&#xff09;查询 多种查询的差异都在做类型和条件上&#x…

[SQL挖掘机] - HAVING语句

经过对分组函数 group by的介绍, 往往少不了having, 所以这篇文章主要介绍having语句. group by分组函数可以查看如下链接; https://tongjier.blog.csdn.net/article/details/131885281 介绍: having 是用于在 group by 查询中对分组结果进行过滤的子句。它允许我们在分组之后…

数据可视化——如何绘制地图

文章目录 前言如何绘制地图添加配置项 根据已有数据绘制地图整体代码展示 前言 前面我们学习了如何利用提供的数据来对数据进行处理&#xff0c;然后以折线图的形式展现出来&#xff0c;那么今天我将为大家分享如何将提数据以地图的形式展现。 如何绘制地图 前面我们绘制折线…

如何从gitee上下载项目并把它在本地运行起来

有时候我们会想到在gitee上下载下来项目&#xff0c;那么怎么把项目下载到本地并跑起来呢&#xff1f; 第一步&#xff1a;在git上找到你想要克隆下来的项目&#xff0c;按照如下操作复制项目地址连接&#xff0c;如下图&#xff1a; 以上可以选择HTTPS和SSH两种形式。 第二步…

REST和RPC的区别

1 REST REST 不是一种协议&#xff0c;它是一种架构。大部分REST的实现中使用了RPC的机制&#xff0c;大致由三部分组成&#xff1a; method&#xff1a;动词&#xff08;GET、POST、PUT、DELETE之类的&#xff09;Host&#xff1a;URI&#xff08;统一资源标识&#xff09;&…