内存泄漏检测工具 memcheck

2020-07-19  本文已影响0人  wayyyy

valgrind

valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核,一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。

官方文档:https://www.valgrind.org/docs/manual/manual.html

valgrind 体系结构.png

这里我们重点介绍:memcheck 是一个细粒度的的内存检查器。


安装

这里我们将valgrind安装在/usr/local/valgrind目录下面。

mkdir tmp
wget http://www.valgrind.org/downloads/valgrind-3.14.0.tar.bz2
tar -jxvf valgrind-3.14.0.tar.bz2
./configure --prefix=/usr/local/valgrind
make
make install

常见内存错误


使用命令格式

valgrind --tool=toolname args-val program args-pro
memcheck命令

输出报告内容分析

memcheck 输出结果会报告5种内存泄露:

definitely lost 和 still reachable

definitely lost
表示确认丢失,程序中存在内存泄露,应尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。

still reachable

void test01() { char *p = new char[1024];  }
void test02()  {  static char* p = new char[1024];}

int main()
{
    test01();
    test02();
}
image.png
indirectly lost

间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复,他们总是与definitely lost一起出现,只要修复definitely lost即可

class Object {
public:
    Object() { _p = new char[1024]; }
    ~Object() { if(_p) delete _p; }
private:
    char* _p = nullptr;
};

void test03() {  Object* obj = new Object();  };

int main() 
{
    test03();
    return 0;
}
image.png
possibly lost

可能丢失。大多数情况下应视为与definitely lost一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址)

suppressed

已被解决。出现了内存泄露但系统自动处理了,可以无视这类错误。


参考资料

  1. https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/
  2. https://windmissing.github.io/linux/2016-02/valgrind-memcheck.html
  3. https://mp.weixin.qq.com/s/VH740i8H4UfHWkzpO5QoTA
上一篇 下一篇

猜你喜欢

热点阅读