这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【工具】valgrind检测C++代码内存泄漏(转载)https://blog.

共2条 1/1 1 跳转至

【工具】valgrind检测C++代码内存泄漏(转载)https://blog.csdn.net/peiyao456/article/details/83040

高工
2018-10-18 08:11:58     打赏

一、valgrind介绍:

valgrind是Linux下的一个开源工具,该工具用来检测c++程序是否有非法使用内存的问题,例如访问了未初始化的内存、访问数组时越界、忘记释放动态内存等问题。Linux下使用命令或者源码安装:

命令简单安装:


yum install valgrind


体系结构图如下:



二、参数:

  --log-file=日志文件名称

  --num-callers=错误记录的追踪行数

  --leak-check=full开启详细的内存泄漏检测器

1

2

3

三、实战:

1、检测内存泄漏:

#include<stdio.h>

#include<stdlib.h>

int main()

{

    int* p = (int*)malloc(sizeof(int));

    return 0;

}

1

2

3

4

5

6

7

编译程序:gcc -g -o mem_discover mem_discover.cpp


gcc编译程序的4个阶段:

预处理阶段:根据以#开头的命令修改原始的c程序,也就是对头文件的替换,可以使用gcc选项的-E来查看。gcc指令的一般格式是:gcc [选项] 要编译的文件 [选项] [目标文件],目标文件可以缺省,gcc默认生成的可执行文件是.out。该阶段处理过的文件是.i文件。

编译阶段:gcc要检查代码的规范性,是否有语法错误,gcc把代码编译成汇编代码。 用户可以使用-S选项来查看。该阶段处理过的文件为.s文件。

汇编阶段:将生成的.s文件转换为二进制的目标文件.o文件。

链接阶段:目标文件转为可执行文件。


检测:valgrind --tool=memcheck --leak-check=full ./mem_discover

结果:



2、检测越界访问(也是使用了未初始化内存):

#include<iostream>

using namespace std;

int main()

{

    int a[10] = {0,1,2,3,4,5,6,7,8,9};

    cout << a[10] << endl;

    return 0;

}

1

2

3

4

5

6

7

8

结果:



3、使用未初始化的内存:

#include<iostream>

using namespace std;

int main()

{

    int a=0,b;

    std::cout << b << endl;

    return 0;

}

1

2

3

4

5

6

7

8

结果:



4、内存读写越界:

#include<iostream>

#include<stdlib.h>

using namespace std;

int main()

{

    int *p = (int*)malloc(sizeof(int)*10);

    *(p+11)=100;

    std::cout << *(p+11) << endl;

    return 0;

}

1

2

3

4

5

6

7

8

9

10

结果:



5、使用了无效指针:

#include<stdio.h>

#include<stdlib.h>

int main()

{

    char* p = (char*)malloc(10);

    p[10] = 'x';

    free(p);

    return 0;

}

1

2

3

4

5

6

7

8

9

结果:



6、重复释放内存:

#include<stdio.h>

#include<stdlib.h>

int main()

{

    char* p = (char*)malloc(10);

    free(p);

    free(p);

    return 0;

}

1

2

3

4

5

6

7

8

9

结果:


--------------------- 

作者:peiyao456 

来源:CSDN 

原文:https://blog.csdn.net/peiyao456/article/details/83040637 

版权声明:本文为博主原创文章,转载请附上博文链接!




管理员
2018-10-18 09:12:00     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]