首页 > 系统相关 >一文掌握C/C++内存泄漏,防止内存泄漏以及检测工具!

一文掌握C/C++内存泄漏,防止内存泄漏以及检测工具!

时间:2023-04-19 18:45:04浏览次数:44  
标签:泄漏 int C++ 内存 指针 ptr 检测工具

在写 C/C++ 代码的时候,经常需要为程序分配动态内存,难免就会发生内存泄漏的情况,本文就来说一下如何防止 C/C++ 内存泄漏!

在说防止内存泄漏前,先说一下什么是内存泄漏。

一、什么是内存泄漏?

通俗一点说就是,程序中动态分配的内存并没有正确的释放。

内存泄漏(Memory leak)是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。     ------   维基百科

来看一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    printf("*p = %d\n", *p);
 
    p = (int*)malloc(sizeof(int));
    *p = 20;
    printf("*p = %d\n", *p);
    free(p);
    return 0;
}

输出为:

*p = 10
*p = 20

在上述代码中,先分配了 int 大小的内存空间给 p,然后再次分配了 int 大小的内存空间,这样,第一次分配的内存空间没有被释放,且没法引用了,这就会导致内存泄漏问题。

内存泄漏会导致系统中可用内存量减少,如果分配了过多的内存而没有正确释放,可能会导致系统或设备异常、降低计算机的性能。

二、如何防止内存泄漏?

1. 成对出现

new和delete ,malloc/calloc和free 应该成对出现。在编程中,可以在使用 new 分配内存后,先写 delete 分配内存,然后在new 和 delete 之间写其它的代码。malloc/calloc 和 free 同理。

2. 智能指针

为了管理指针,在C++中引入了智能指针,包括:auto_ptr、unique_ptr、shared_ptr、weak_ptr,其中,auto_ptr在 C++11中已经被抛弃。

智能指针是用一个类来管理指针,通过析构函数来释放资源,这样在一定程度上避免了内存泄漏问题。

下面来看一个例子:

#include <iostream>
#include <memory> //智能指针头文件
using namespace std;
 
int main() {
 
    shared_ptr<int> ptr(new int(10));
    cout<<"*ptr = "<<*ptr<<endl;
}

三、内存泄漏检测工具

1. Valgrind

Valgrind 工具可以自动检测许多内存管理和线程错误,可以详细的分析程序。

Valgrind主要包括7个工具,一个内存错误检测器、两个线程错误检测器、一个缓存和分支预测分析器、一个调用图生成缓存和分支预测分析器,以及两个不同的堆分析器。

操作系统:类Unix操作系统

2. PurifyPlus

PurifyPlus是一个运行时分析工具组件,可在程序运行时对其进行监控。

主要组件有:

Purify : 用于内存使用跟踪和内存错误检测;

Quantify : 用于性能分析、代码流和线程可视化;

PureCoverage : 源代码覆盖率分析;

操作系统:可以在 Windows、Linux、Solaris、AIX 等操作系统上使用;

标签:泄漏,int,C++,内存,指针,ptr,检测工具
From: https://www.cnblogs.com/lidabo/p/17334293.html

相关文章

  • 内存问题难定位,那是因为你没用ASAN
    ASAN全称:AddressSanitizer,google发明的一种内存地址错误检查器。目前已经被集成到各大编译器中。本文分享自华为云社区《内存定位利器-ASAN使用小结》,作者:云存储开发者支持团队。1.什么是ASANASAN全称:AddressSanitizer,google发明的一种内存地址错误检查器。目前已经被集......
  • 使用mprotect定位踩内存故障
    前言对于C语言来说,内存被踩是比较常见的问题,轻则普通变量被改写程序逻辑出错,重则指针变量被改写引发指针解引用出现未定义行为风险;定位内存被踩一直是棘手的难题,如果出现程序跑死,一般可以通过堆栈信息来定位:1)查看跑死的调用链,确定跑死代码的位置;2)根据pc指针找到具体代码;3)走......
  • GE反射内存实时通讯网络解决方案
    时通讯网络是用于需要较高实时性要求的应用领域的专用网络通讯技术,一般采用基于高速网络的共享存储器技术实现。它除了具有严格的传输确定性和可预测性外,还具有速度高、通信协议简单、宿主机负载轻、软硬件平台适应性强、可靠的传输纠错能力、支持中断信号的传输等特点。本方案选......
  • Linux内存管理之mem_map对象.md
    在linux内核中,所有的物理内存都用structpage结构来描述,这些对象以数组形式存放,而这个数组的地址就是mem_map。内核以节点node为单位,每个node下的物理内存统一管理,也就是说在表示内存node的描述类型structpglist_data中,有node_mem_map这个成员,其针对平坦型内存进行描述(CONFIG_FL......
  • CANN开发实践:4个DVPP内存问题的典型案例解读
    摘要:由于DVPP媒体数据处理功能对存放输入、输出数据的内存有更高的要求(例如,内存首地址128字节对齐),因此需调用专用的内存申请接口,那么本期就分享几个关于DVPP内存问题的典型案例,并给出原因分析及解决方法。本文分享自华为云社区《FAQ_DVPP内存问题案例》,作者:昇腾CANN。DVPP是昇腾......
  • 实时查看Docker容器占用的CPU、内存状态
    安装Linux下安装方法:wgethttps://github.com/bcicen/ctop/releases/download/v0.5/ctop-0.5-linux-amd64-Octopsudomvctop/usr/local/bin/sudochmod+x/usr/local/bin/ctop执行命令:ctop使用ctop运行后,通过下面的按键可以实现不同的功能1)a-只查看运行状态的容器f-......
  • 在Go语言中,如何优化内存使用效率?
    在Go语言中,可以通过以下几种方式来优化内存使用效率:避免使用过多的内存尽可能地避免使用过多的内存是最有效的内存优化方法之一。在编写代码时,应该尽可能地避免使用全局变量和大量的临时变量。同时,可以使用常量、静态变量和缓存等方式来避免频繁地分配和释放内存。及时释放不......
  • 【valgrind】软件调试工具-valgrind内存调试工具
    valgrind工具安装Ubuntu环境安装sudoaptinstallvalgrind源码编译1.源码下载http://valgrind.org/downloads/valgrind-3.12.0.tar.bz22.valgrind编译安装tar-jxvfvalgrind-3.12.0.tar.bz2cdvalgrind-3.12.0./configuremakesudomakeinstallvalgrind运行分析程......
  • SQL Server占用内存不释放卡死问题
      最近项目中发现使用SQLServer的机器会出现10天左右占满内存卡死情况,百度后发现对应的原因如下:    即:SQLServer内存管理是分配了最大内存是多少,就会使用多少,在再次使用的时候,才会释放掉空闲的内存,它不会主动全部释放掉所有空闲内存。所以解决方式是:在sqlSe......
  • 内存屏障--- asm volatile("" ::: "memory")
    转载:(14条消息)内存屏障---asmvolatile("":::"memory")_"asm(:::\"memory\")"_咕噜咕噜斯基的博客-CSDN博客CompilermemorybarrierThesebarrierspreventacompilerfromreorderinginstructions,theydonotpreventreorderingbyCPU.T......