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


🎈 作者: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 等操作系统上使用;


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


Visual Leak Detector是一款免费的、健全的、开源的Visual C++内存泄露检测系统。相比Visual C++自带的内存检测机制,Visual Leak Detector可以显示导致内存泄露的完整内存分配调用堆栈。 下载Visual Leak Detector,当前版本2.2.3,在Visual C++ IDE的"工具"→"选项"→"项目和解决方案"→"VC++ 目录","包含文件"增加VLD的"\include"路径,"库文件"增加VLD的"\lib\Win32"路径,另外动态库"\bin\Win32"路径在安装时已经添加到环境变量里面了,若是未添加,则需要手动拷贝"\bin\Win32"下的文件到工程Debug目录。下 展开查看详细 收起信息 返回顶部 1.新建一个Win32控制台项目; 2.添加代码如下所示: #include "stdafx.h" #include "vld.h" int _tmain(int argc, _TCHAR* argv[]) { char *pBuf = new char[200]; return 0; } 3.在Debug模式下的“输出”窗口,将有如下信息: 报告列出了内存泄露是在第几块,所在的地址,泄露的字节,调用的堆栈,内存内容。双击调用堆栈可以跳转到所在行。 4.在Release模式下,不会链接Visual Leak Detector。 5.Visual Leak Detector有一些配置项,可以设置内存泄露报告的保存地(文件、调试器),拷贝"\Visual Leak Detector"路径下的vld.ini文件到工程的Debug目录下(在IDE运行的话,则需要拷贝到工程目录下),修改以下项: ReportFile = .\memory_leak_report.txt ReportTo = both 直接双击Debug目录下exe,文件内容跟“输出”窗口的内容一样。
评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值