前言
C/C++运行高效,不管是操作系统内核还是对性有要求的程序(比如游戏引擎)都要求使用C/C++来编写,其实C/C++强大的一点在于能够使用指针自由地控制内存的使用,适时的申请内存和释放内存,从而做到其他编程语言做不到的高效地运行。但是内存管理是一把双刃剑,用好了削铁如泥,用不好自断一臂。在申请堆上内存使用完之后中如果做不到适时有效的释放,那么就会造成内存泄露,久而久之程序就会将系统内存耗尽,导致系统运行出问题。就如同你每天跑去图书馆借一打书籍而不还,直到图书馆倒闭为止。
C语言中申请内存和释放内存的方法是使用 malloc和free。
C++中能兼容C,所以也能使用malloc和free,面向对象的情况下使用的则是new和delete,能够自动执行构造函数和析构函数。
如何发现内存泄露
内存泄漏一般不会造成程序崩溃,所以比较隐晦,但是发现内存泄露的方法也很简单,就是让程序运行一段时间,然后查看内存先后变化,通过任务管理器(windows)或者top(unix/linux)来监控某个进程的内存变化是比较方便的,有些程序的内存泄露比较小,但是发现它的内存泄露也都是时间问题。这里列出一个内存泄漏的程序的内存变化时间图,可以看出其内存占用总体上是呈递增的
内存泄漏较大的情况下,机器cpu使用率飙升,cpu的wait百分比增加,通过top可以看到swap内存使用量不断增加,kswap进程不时出现在进程列表当中。
linux中可以通过watch -n1 "ps -o vsz -p <PID>",实时看到特定进程的内存使用量不断地增加
valgrind定位内存泄露
Valgrind是一个用于构建动态分析工具的工具框架。Valgrind工具可以自动检测许多内存管理和线程错误,并详细分析程序。您还可以使用Valgrind来构建新工具。valgrind的默认工具就是内存检测,除此之外还有其他的监控功能,这里不做太多讨论。
valgrind的安装
debian/ubuntu派系的linux下安装方法:
itcast@ubuntu:~$ sudo apt install valgrind
redhat/centos下
[itcast@localhost ~]$ sudo yum install valgrind
valgrind的使用
这里是测试的一个C程序例子
#include <stdlib.h>
#include <stdio.h>
void func()
{
//只申请内存而不释放
void *p=malloc(sizeof(int));
}
int main()
{
func();
getchar();
return 0;
}
编译程序
gcc -o ./a.out ./main.c
使用valgrind命令来执行程序同时输出日志到文件
valgrind --log-file=valReport --leak-check=full --show-reachable=yes --leak-resolution=low ./a.out
–log-file=valReport 是指定生成分析日志文件到当前执行目录中,文件名为valReport
–leak-check=full 显示每个泄露的