首页 > 系统相关 >内存泄漏

内存泄漏

时间:2023-12-09 21:34:02浏览次数:32  
标签:泄漏 malloc mtrace free 内存 使用

一般指堆的内存泄漏,简单来说就是已申请的内存空间没有被正确释放。

避免内存泄露的几种方式

  • 计数法:使用new或者malloc时,让该数+1,delete或free时,该数-1,程序执行完打印这个计数,如果不为0则表示存在内存泄露
  • 一定要将基类的析构函数声明为虚函数
  • 对象数组的释放一定要用delete []
  • 有new就有delete,有malloc就有free,保证它们一定成对出现

检测工具

  • Linux下可以使用Valgrind工具
  • Windows下可以使用CRT库

在 Linux 或 macOS 下,有多种工具可以用来检测内存泄漏。以下是一些常用的方法:

  1. mtrace:mtrace 是 GNU Glibc 自带的内存问题检测工具,它可以用来协助定位内存泄露问题。mtrace 的基本设计原理为设计一个函数 void mtrace(),函数对 libc 库中的 malloc/free 等函数的调用进行追踪,由此来检测内存是否存在泄漏的情况。使用 mtrace 时,需要在代码中包含 <mcheck.h>,并在程序开始时调用 mtrace(),在程序结束时调用 muntrace()。同时,需要设置环境变量 MALLOC_TRACE 来指定日志文件的路径。
#include <mcheck.h>
#include <stdlib.h>

int main() {
    mtrace();  // 开始跟踪

    char *p = (char *)malloc(100);
    free(p);
    p = NULL;
    p = (char *)malloc(100);

    muntrace();  // 结束跟踪,并生成日志信息
    return 0;
}
  1. Valgrind1:Valgrind 是一套开源的仿真调试工具集合,其中的 Memcheck 工具可以用来检测程序中出现的内存问题,包括内存泄漏。使用 Valgrind 进行内存泄漏检测时,只需要在命令行中使用 valgrind --leak-check=yes your_program 命令运行你的程序即可。

  2. ps 命令2:在 Linux 平台,可以使用 ps 命令来监视内存的使用,观测指定进程的 VSZ 值,从而发现可能的内存泄漏。

 

标签:泄漏,malloc,mtrace,free,内存,使用
From: https://www.cnblogs.com/whcjob/p/17891517.html

相关文章

  • 内存热插拔 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/memory-hotplug.html内存热插拔内存热插拔事件通知热插拔事件被发送到一个通知队列中。在include/linux/memory.h中定义了六种通知类型:MEM_GOING_ONLINE在新内存可用之前生成,以便准备子系统处理内存。页分配器仍然无法......
  • 引导时内存管理 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/boot-time-mm.html#c.memblock_flags"Boottimememorymanagement"(引导时间内存管理)早期系统初始化不能简单地使用“正常”的内存管理,因为它还没有设置。但是仍然需要为各种数据结构分配内存,例如物理页面分配器。一种名为mem......
  • 内存管理文档 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/mm/index.html内存管理指南这是关于Linux内存管理子系统的指南。如果您只是想了解如何分配内存,请参阅内存分配指南。有关控制和调整指南,请参阅管理员指南。物理内存页表进程地址引导内存页分配虚拟连续内存分配Slab分配高内存......
  • 内存分配指南 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/memory-allocation.html内存分配指南Linux提供了各种用于内存分配的API。您可以使用kmalloc或kmem_cache_alloc系列来分配小块内存,使用vmalloc及其衍生物来分配大的虚拟连续区域,或者直接使用alloc_pages从页面分配器请求页面。......
  • Volatility2.6内存取证工具安装及入门Linux和Windows下安装
    (Volatility2.6内存取证工具安装及入门Linux和Windows下安装)1-1.Volatility2.6简介Volatility是一个完全开源的工具,用于从内存(RAM)样本中提取数字工件。支持Windows,Linux,MaC,Android等多类型操作系统系统的内存取证。那么针对竞赛这块(CTF、技能大赛等)基本上都是用在Misc方......
  • 内存可见于内存可用
    在GPU执行过程中有责任保证接下来访问的这块内存是保证有效的,也就是确保先前写入的数据对目标单元可见。简单介绍一下GPUCache体系,平时听得比较多的是CPUCache,但是GPU同样有着自己的Cache体系。如下图所示,在这里可以看GPU同样是有着L1/L2Cache的架构。 那么在GPU中是如何......
  • 内存分配
    这里主要讲一下模拟过程中遇到的问题和想法首先,为了保证模拟正确,我们应该以时间为参考对象去模拟,这样比以即将进入的任务或者等待队列中的任务为参考对象讨论的情况更少,犯的错误更少,每到达一个新时间如果有任务进入或者有任务完成就可以进行处理其次,这道题目的\(N\)非常大,所以我......
  • c++ 程序的内存分配
    C++程序在执行时,将内存大致分为以下几个区域:栈:系统自动分配的空间,只要不特殊声明,就定义在栈区,函数的区域也在栈上。栈是向下增长的。(const在栈里)堆:使用动态内存分配的方式可以申请堆空间,用完要手动释放。newmalloc全局区:全局变量、静态变量(static),生命周期是程序整个运行过......
  • 栈内存和堆内存概念、内存逃逸分析
    为了让程序员更好地专注于业务代码的实现,Go语言增加了垃圾回收机制,自动地回收不再使用的内存。Go语言有两部分内存空间:栈内存和堆内存。1.栈内存栈只允许往线性表的一端放入数据,之后在这一端取出数据,按照后进先出(LIFO,LastInFirstOut)的顺序,如图所示。往栈中放入元素......
  • [电脑装机] 内存篇
    [装机|配置升级]内存篇内存也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据。一、部分内存参数我们一般能在内存条(SDRAM)的标签上的可以看到型号和参数。型号是内存条厂商自己定义的,不同厂商的定义规则不一致,一般可以通过型号识别内存参......