在Linux下编写C程序,怎么检查程序是否有内存泄漏?

From: http://bbs.chinaunix.net/thread-908769-1-1.html

如题。

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

找到了!  http://www.valgrind.org/

同时附一个转自 http://blog.chinaunix.net/u/18381/showart.php?id=162015 的示例:

#include <stdlib.h>

void f(void)
{
   int* x = malloc(10 * sizeof(int));
   x[10] = 0;        // problem 1: heap block overrun
}                    // problem 2: memory leak -- x not freed

int main(void)
{
     f();
     return 0;
}

编译代码:  
gcc -Wall example.c -g -o example 

注意:gcc 的-g 选项让Valgrind调试输出时指出相应信息的代码所在的行号。

运行valgrind: 
valgrind --tool=memcheck --leak-check=yes ./example

valgrind的执行结果: 
==6742== Memcheck, a memory error detector for x86-linux.
==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux.
==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==6742== For more details, rerun with: -v
==6742==
==6742== Invalid write of size 4
==6742==    at 0x8048384: f (example.c:6)
==6742==    by 0x80483AC: main (example.c:12)
==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd
==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
==6742==    by 0x8048377: f (example.c:5)
==6742==    by 0x80483AC: main (example.c:12)
==6742==
==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)
==6742== malloc/free: in use at exit: 40 bytes in 1 blocks.
==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
==6742== For counts of detected errors, rerun with: -v
==6742== searching for pointers to 1 not-freed blocks.
==6742== checked 1360800 bytes.
==6742==
==6742==
==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
==6742==    by 0x8048377: f (example.c:5)
==6742==    by 0x80483AC: main (example.c:12)
==6742==
==6742== LEAK SUMMARY:
==6742==    definitely lost: 40 bytes in 1 blocks.
==6742==    possibly lost:   0 bytes in 0 blocks.
==6742==    still reachable: 0 bytes in 0 blocks.
==6742==         suppressed: 0 bytes in 0 blocks.
==6742== Reachable blocks (those to which a pointer was found) are not shown.
==6742== To see them, rerun with: --show-reachable=yes

上面的C程序存在两个错误:1. 数组下标越界;2. 分配的内存没有释放,存在内存泄露的问题。
对于错误1,看Valgrind的调试信息片断
==6742== Invalid write of size 4
==6742==    at 0x8048384: f (example.c:6)
==6742==    by 0x80483AC: main (example.c:12)
==6742==  Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd
==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
==6742==    by 0x8048377: f (example.c:5)

对于错误2,看这个
==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
......
==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)
==6742==    by 0x8048377: f (example.c:5)
==6742==    by 0x80483AC: main (example.c:12)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯】历届试题 错误票据

历届试题 错误票据 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的&#xff0c;但ID的开始数码是随机选定的。 因为工作人员疏忽&#xff0c;在…

apue源码编译

http://www.apuebook.com/ 可以下载源码src.tar.gz 修改配置文件 编辑源码解压生成的apue.2e文件夹下的Make.defines.linux 修改WKDIR/home/var/apue.2e为你的apue.2e目录&#xff0c;比如我的apue源码解压在/usr/local,那我就改为&#xff1a; WKDIR/usr/local/apue .2e 然后…

一个跨平台的 C++ 内存泄漏检测器

From&#xff1a;http://www.ibm.com/developerworks/cn/linux/l-mleak2/index.html 内存泄漏对于C/C程序员来说也可以算作是个永恒的话题了吧。在Windows下&#xff0c;MFC的一个很有用的功能就是能在程序运行结束时报告是否发生了内存泄漏。在Linux下&#xff0c;相对来说就没…

PAT 1039. 到底买不买(20)

题目链接&#xff1a;https://www.patest.cn/contests/pat-b-practise/1039 解题思路&#xff1a;自己刚开始想的是用两个字符串来做&#xff0c;搜别人题解的时候发现别人一种很好的解题思路&#xff0c;是用string做的&#xff0c;感觉做的很巧妙 具体的代码如下&#xff1a;…

ios UIPickerView 技巧集锦

重新实现 UIPickerView 参考资料: http://www.cocoachina.com/bbs/read.php?tid85374 http://www.cocoachina.com/iphonedev/toolthain/2011/1205/3663.html 设置循环滚动 设置 UIPickerView 的数据源数量为很大的规模, 取数据时对行数进行取模, 从而实现循环滚动的效果. 在每…

PHP-递归扫描目录和删除目录

(1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){// 打开目录$dh opendir($path);echo <ul>;// 循环读取目录while(($file readdir($dh)) ! false){// 先要过滤掉当前目录.和上一级目录..if($file . || $file ..) continue;// 为了能够显示…

std::map的insert和下标[]访问

From: http://www.cnblogs.com/kex1n/archive/2011/11/16/2251520.html 在map中插入元素 改变map中的条目非常简单&#xff0c;因为map类已经对[]操作符进行了重载 enumMap[1] "One"; enumMap[2] "Two"; ..... 这样非常直观&#xff0c;但存在一个性…

Delphi工具之TDUMP

TDUMP是一个命令行程序&#xff0c;它输出.exe或.dll&#xff08;以及其他文件类型&#xff09;文件的结构。 TDUMP位于Delphi安装目录下的Bin目录里&#xff0c;如下&#xff1a; 缺省时&#xff0c;TDUMP的输出显示到屏幕上&#xff1b; 用户可以将TDUMP的输出定向到一个文本…

《与mysql零距离接触》视屏学习笔记

1、数据表的增删改查操作(crud)&#xff1a; 对于表&#xff1a; 增&#xff1a;create table XXXX 删&#xff1a;drop table XXXX 改&#xff1a;alter table XXXX rename to XXXX 查&#xff1a;select * from XXXX 对于行&#xff1a; 增&#xff1a;insert into XXXX(…

[Linux C]重启设备(系统)

说白了其实很简单&#xff0c;看代码: [zcmc #17]$cat r.c#include <sys/reboot.h>int main( void ){puts("reboot now");reboot(RB_AUTOBOOT);return 0;}[zcmc #18]$makegcc -g -o r r.c [zcmc #19]$执行下"./r"&#xff0c;系统将会重启&#xff0…

网络监控如影随形

网络监控如影随形 作为网络管理人员要做好网络设备的流量监控&#xff0c;及时洞悉网络流量的变化&#xff0c;就能及时发现潜在的网络故障&#xff0c;及时定位故障部位&#xff0c;及时予以排除&#xff0c;从而做到防患于未然。可是网管人员经常会由于各种事情不再网管机旁边…

JAVA基础进阶day01

最近一段时间的自学重心是安卓底层。首先啃一下java。新年伊始&#xff0c;向着 知识的海洋急行军&#xff0c;世界人民团结万岁…. 笔记方式为代码加注释的方式: 一、最基础 public class Hello {public static void main(String args[]) {System.out.println("Hello,…

libevent的使用(socket)

From: http://blog.csdn.net/kaitiren/article/details/35253319 这篇文章介绍下libevent在socket异步编程中的应用。在一些对性能要求较高的网络应用程序中&#xff0c;为了防止程序阻塞在socket I/O操作上造成程序性能的下降&#xff0c;需要使用异步编程&#xff0c;即程序…

消费者承担消费税真的吃亏了吗?

像小老鼠一样享受&#xff0c;才不管消费税呢其实&#xff0c;我本来对经济学不感兴趣。一次偶然的机会&#xff0c;我在朋友的寝室里看到了传说中经济学最经典的教材之一——曼昆&#xff08;Mankiw&#xff09;的《经济学原理》。好奇心驱使我随手翻开了一页&#xff0c;读了…

JAVA进阶day02

老规矩&#xff0c;贴代码做注释&#xff1a; class Person {static int count;String name;int age;String getName() {return "guangdong "name;}static {System.out.println("static block"); }{System.out.println("construct block");…

cocos2dx libevent简介和使用

From: http://blog.csdn.net/kaitiren/article/details/35254577 libevent是一个基于事件触发的网络库&#xff0c;memcached底层也是使用libevent库&#xff0c;今天学习下。总体来说&#xff0c;libevent有下面一些特点和优势&#xff1a;* 统一数据源&#xff0c; 统一I/O事…

Linux查看主板的相关信息

一条命令就能知道主板的一些信息&#xff0c;具体的内容就无需解释了&#xff0c;诸如厂商啊什么的&#xff0c;英文词的借助Google吧&#xff0c;哈哈 转载于:https://blog.51cto.com/kumu1988/1086248

jenkins相关

1. jenkins maven tomcat做持续集成的时候几个关键配置&#xff1a;http://my.oschina.net/congqian/blog/112782?fromerrPmIDbLs5 2. Linux下安装Git&#xff1a;http://www.cnblogs.com/zhcncn/p/4030078.html 3. jenkins的使用教程&#xff1a;修改jenkins默认的用户&#…

Java进阶day03继承

先贴代码后分析&#xff1a; class Person {private int age;public void setAge(int age) {if (age < 0 || age > 200)age 0;else {this.age age;}}public int getAge() {return age;} public void printInfo() {System.out.println("age "age);}public…

在mac上配置cocos2d-x开发环境

From: http://www.cnblogs.com/xiaodao/archive/2013/01/08/2850751.html 一、下载cocos2d-x最新安装包 在终端中cd到本地将要存放目录&#xff0c;执行git命令 git clone https://github.com/cocos2d/cocos2d-x.git 二、如果开发ios程序&#xff0c;需要配置xcode模板 下好…