当前位置 博文首页 > Linux猿:一文掌握C/C++内存泄漏,防止内存泄漏以及检测工具!

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

    作者:[db:作者] 时间:2021-09-17 09:01


    🎈 作者:Linux猿

    🎈 简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

    🎈 关注专栏:C/C++面试通关集锦?(优质好文持续更新中……)🚀


    目录

    一、什么是内存泄漏?

    二、如何防止内存泄漏?

    1. 成对出现

    2. 智能指针

    三、内存泄漏检测工具

    1. Valgrind

    2. PurifyPlus


    在写 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 等操作系统上使用;


    🎈 欢迎小伙伴们点赞👍、收藏?、留言💬


    cs