linux脏内存代码,linux平台代码内存泄露检查

linux内存泄露检测// file        : demo.cpp// description : show the memmory leak detectionint main(){    int* a = new int[10];  // 1, new and not delete

a[10] = 1;             // 2, array over range}

cppcheck 静态检查可以选择 vscode 安装 cppcheck 插件zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ cppcheck demo.cpp

Checking demo.cpp...

[demo.cpp:41]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.

[demo.cpp:45]: (error) Memory leak: a

ps. 不能检测太复杂的代码,检测如下 mtrace 的代码, mtrace 等系统调用会干扰检查结果

mtrace需要在代码中添加mtrace()来检查堆的一致性,另外需要设置环境变量MALLOC_TRACE#include          // setenv#include          // strerror#include #include          // errno#include #include int main(){    using std::string;    using std::cerr;    using std::endl;    const string mtraceFl( "mtrace_outfile" );

if( -1 == setenv( "MALLOC_TRACE", mtraceFl.c_str(), 1 ) )        cerr <

mtrace();    int* a = new int[10];

a[10] = 1;

muntrace();

}编译时加入调试选项-g和链接库-mcheck,调用完成调用mtrace分析输出的数据文件zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ g++ -g -o demo demo.cpp -lmcheck

zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ ./demo

zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ mtrace mtrace_outfile

Memory not freed:

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

Address     Size     Caller

0x0000000000698460     0x28  at 0x7fdd0281ce78

ps. 不能检测检查到内存非法访问

valgrind可以检查出非法访问,但是mtrace同样会被认定为内存泄露zhanghl@zhanghl-Inspiron-7460:~/workspace/env/05_valgrind$ valgrind ./demo

==22941== Memcheck, a memory error detector

==22941== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.

==22941== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info

==22941== Command: ./demo

==22941==

==22941== Invalid write of size 4                                            // 1, 内存非法访问,可以定位到代码

==22941==    at 0x400F03: main (demo.cpp:38)

==22941==  Address 0x5ab74a8 is 0 bytes after a block of size 40 alloc'd

==22941==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==22941==    by 0x400EF6: main (demo.cpp:25)

==22941==

==22941==

==22941== HEAP SUMMARY:

==22941==     in use at exit: 73,256 bytes in 3 blocks

==22941==   total heap usage: 7 allocs, 4 frees, 74,452 bytes allocated

==22941==

==22941== LEAK SUMMARY:

==22941==    definitely lost: 552 bytes in 2 blocks                   // 2块内存泄露,其中一块是 mtrace() 引入的

==22941==    indirectly lost: 0 bytes in 0 blocks

==22941==      possibly lost: 0 bytes in 0 blocks

==22941==    still reachable: 72,704 bytes in 1 blocks                // 3, still rechable 没有关系

==22941==         suppressed: 0 bytes in 0 blocks

==22941== Rerun with --leak-check=full to see details of leaked memory

==22941==

==22941== For counts of detected and suppressed errors, rerun with: -v

==22941== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)查看详细信息,--leak-check=full -v...

==23742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 3

==23742==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==23742==    by 0x400EF6: main (demo.cpp:25)

==23742==

==23742== 512 bytes in 1 blocks are definitely lost in loss record 2 of 3

==23742==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)

==23742==    by 0x545AF57: mtrace (mtrace.c:296)

==23742==    by 0x400EEC: main (demo.cpp:23)

...

作者:呆呆的张先生

链接:https://www.jianshu.com/p/cac5d5beadb8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值