中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
请问如何知道我内存中是否有malloc分配的没有回收的变量。
作者:未知 时间:2005-09-13 19:28 出处:ChinaUnix.net 责编:chinaitpower
              摘要:请问如何知道我内存中是否有malloc分配的没有回收的变量。

如题,谢谢

 xhl 回复于:2004-04-02 14:14:25
没有人了解这个吗,我UP

 birdielu 回复于:2004-04-02 14:19:25
恩,我觉得时间可以证明,当你的内存空间越来越少时,效率就会越来越慢.另外在linux中好像有条命令可以查看,但是我忘了,你知道的话,告诉我,谢谢.

 燕尾服 回复于:2004-04-02 14:21:44
UNIX 下有top linux不知有没有

 zkyguanl 回复于:2004-04-02 14:24:08
[quote:eaf91ffd23="xhl"]如题,谢谢[/quote:eaf91ffd23]

.c file
-------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "MC_check.h"

static MEMORY_LINK_PTR  memory_link;
static size_t           memory_link_num;
static ERROR_MEMORY_PTR memory_error_link;
static size_t           memory_error_link_num;

/*
======================================================
 add_alloc_cell_to_link: add the memory to the global
 variable memory_link.
======================================================
*/
static void add_alloc_cell_to_link( void *ptr, size_t len, char *info, int linenum )
{
MEMORY_LINK_PTR  memory;

memory=(MEMORY_LINK_PTR)malloc(sizeof(MEMORY_LINK));
if( memory==NULL ){
fprintf(stderr,"\nCannot allocate more memory.\n\n");
exit(-1);
}
memory->address=ptr;
memory->len=len;
memory->next=memory_link;
strncpy( memory->info, info, 99 );
(memory->info)[99]='\0';
memory->linenum=linenum;
memory_link=memory;
memory_link_num++;
return;
}

/*
============================================
 add_memory_error_link: add error memory to
 memory_error_link.
============================================
*/
static void add_memory_error_link( void *ptr, char flag )
{
ERROR_MEMORY_PTR  memory;

memory=(ERROR_MEMORY_PTR)malloc(sizeof(ERROR_MEMORY));
if( memory==NULL ){
fprintf(stderr,"\nCannot allocate more memory.\n\n");
exit(-1);
}
memory->address=ptr;
memory->errorflag=flag;
(memory->info)[0]='\0';
memory->linenum=-1;
memory->next=memory_error_link;
memory_error_link=memory;
memory_error_link_num++;
}

/*
============================================
 delete_memory: delete the memory in the
 memory link
============================================
*/
static void delete_memory( void *ptr )
{
MEMORY_LINK_PTR  mpre, mnow, mnext;

mpre=mnow=memory_link;
if( memory_link->address == ptr ){
free( ptr );
mnow=memory_link->next;
free( memory_link );
memory_link=mnow;
memory_link_num--;
return;
}
mnext=mnow->next;
while( mnext!=NULL && mnext->address!=ptr ) { mnow=mnext; mnext=mnext->next; }
if( mnext==NULL ) {
add_memory_error_link( ptr, ERROR_MEM_UNALLOC );
return;
}
if( mnext->address==ptr ){
mnow->next = mnext->next;
free( ptr );
free( mnext );
memory_link_num--;
return;
}
}

/*
================================================
 is_in_memory_link: check if ptr is in the link
================================================
*/
static int is_in_memory_link( void *ptr )
{
MEMORY_LINK_PTR  mem;

mem=memory_link;
while( mem!=NULL && mem->address!=ptr ) mem=mem->next;
if( mem==NULL ) return 0;
else return 1;
}

/*
============================================
 MC_alloc substitutes for the function alloc
============================================
*/
void *MC_alloc( size_t len, char *info, int linenum)
{
void *ptr;

ptr=malloc(len);
if( ptr==NULL ) return NULL;
add_alloc_cell_to_link( ptr, len, info, linenum );

return ptr;
}

/*
============================================
 MC_free substitutes for the function free
============================================
*/
void MC_free( void *ptr )
{
if( ptr==NULL ){
add_memory_error_link( ptr, ERROR_FREE_ZERO );
return;
}
if( is_in_memory_link( ptr ) ){
delete_memory( ptr );
}else{
add_memory_error_link( ptr, ERROR_MEM_UNALLOC );
}
return;
}

/*
=====================================
 MC_realloc substitutes for realloc
=====================================
*/
void *MC_realloc(void *ptr, size_t len, char *info, int linenum)
{
MEMORY_LINK_PTR   mem;
void             *ptrnew;

if( ptr==NULL ) return MC_alloc(len,info,linenum);
mem=memory_link;
while( mem->address!=ptr ) mem=mem->next;
if( mem==NULL ) {
add_memory_error_link( ptr, ERROR_UNALLOC_REALLOC );
return NULL;
}

ptrnew=realloc(ptr,len);
mem->address=ptrnew;
mem->len = len;
strncpy(mem->info,info,99);
mem->linenum=linenum;
(mem->info)[99]='\0';
return ptrnew;
}

/*
============================================
 MC_init: initializing the global variables
============================================
*/
void  MC_init()
{
memory_link=NULL;
memory_link_num=0;
memory_error_link=NULL;
memory_error_link_num=0;
}

/*
==========================================
 MC_destroy: destroy the global variables
==========================================
*/
void MC_destroy()
{
MEMORY_LINK_PTR  mem, mem1;
ERROR_MEMORY_PTR mem_error, mem_error1;

mem=memory_link;
while( mem!=NULL ){
mem1=mem->next;
free( mem );
mem=mem1;
}
mem_error=memory_error_link;
while( mem_error!=NULL ){
mem_error1=mem_error->next;
free( mem_error );
mem_error=mem_error1;
}
memory_link=NULL;
memory_link_num=0;
memory_error_link=NULL;
memory_error_link_num=0;
return;
}

/*
==========================================
 MC_print_error: print the memory errors.
==========================================
*/
void MC_print_error()
{
MEMORY_LINK_PTR  mem, mem1;

fprintf(stderr,"\nThe leak memory:\n");
mem=memory_link;
if( mem==NULL ) fprintf(stderr,"\tNone.\n");
while( mem!=NULL ){
mem1=mem->next;
fprintf(stderr,"\tAddress: %p\tLinenum: %d\tInfo: %s\n",mem->address,mem->linenum,mem->info);
mem=mem1;
}
}
-------------------------
.h file
--------------------------
#ifndef  MC_MEMORY
#define  MC_MEMORY

#include <stdlib.h>

#define  INFOLEN  100;

/**  error flags  **/
#define  ERROR_ALLOC_NOTFREE  0
#define  ERROR_FREE_ZERO      1
#define  ERROR_MEM_UNALLOC    2
#define  ERROR_UNALLOC_REALLOC  3

typedef struct memory_link_
{
void     *address;
char      info[100];
int       linenum;
size_t    len;
struct memory_link_  *next;
}MEMORY_LINK, *MEMORY_LINK_PTR;

typedef struct error_memory_
{
void     *address;
char      errorflag;
char      info[100];
int       linenum;
struct error_memory_ *next;
}ERROR_MEMORY, *ERROR_MEMORY_PTR;

void  MC_print_error();
void  MC_destroy();
void  MC_init();
void *MC_realloc(void *ptr, size_t len, char *info, int linenum);
void  MC_free( void *ptr );
void *MC_alloc( size_t len, char *info, int linenum);

#endif
----------------------------
如果在你的程序里用的函数是 malloc realloc free

那么在你的头文件里加上
#define malloc(x) MC_alloc(x,__FILE__,__LINE__)
#define realloc(x,y) MC_realloc(x,y,__FILE__,__LINE__)
#define free(x) MC_free(x,__FILE__,__LINE__)
-------------------------
在你的程序开头调用 MC_init();
在程序结尾调用MC_print_error(); MC_destroy();
----------------------

 xhl 回复于:2004-04-02 14:29:52
谢谢,我适适,嘿嘿!

 xhl 回复于:2004-04-02 15:13:48
TO zkyguanl 
我太菜了,呵呵,你那个文件我根本就编译不过去,怎么回是,
出来很多错误,呵呵 我哭!!!!!

 zkyguanl 回复于:2004-04-02 15:16:12
[quote:e4e9f8877f="xhl"]TO zkyguanl 
我太菜了,呵呵,你那个文件我根本就编译不过去,怎么回是,
出来很多错误,呵呵 我哭!!!!![/quote:e4e9f8877f]
----------------------------------------------------
你将 .c 文件 命名为 MC_check.c
.h文件命名为 MC_check.h
和你的文件放在同一目录下。
--------------------
能不能将编译的错误放上来看看?

 aero 回复于:2004-04-02 16:32:49
zkyguanl 兄的程序通读过了,写的非常好。思想也很好。只是有两个小毛病:delete_memory函数里有定义变量没有使用的情况;MC_realloc函数里有一个循环的判断条件少了一个。整体来说,写的非常好。尤其是想法!
to xhl:C中本身没办法查内存是否释放的问题,依赖于程序员良好的习惯。如果没有手动free的空间,只能等进程结束了的时候,有系统统计收回了。如果进程不结束,不听申请,而又不free。系统内存很快会消耗光的。这个,前面我发的帖子里有做实验。

 xhl 回复于:2004-04-02 16:39:38
[quote:4cdd0350a2="zkyguanl"]
----------------------------------------------------
你将 .c 文件 命名为 MC_check.c
.h文件命名为 MC_check.h
和你的文件放在同一目录下。
--------------------
能不能将编译的错误..........[/quote:4cdd0350a2]

我是按你说的这样做的,呵呵,可还是调不出来,
呵呵,先不弄了,以后慢慢研究,谢谢!

 zkyguanl 回复于:2004-04-02 16:43:08
[quote:2a8da6b58e="aero"]zkyguanl 兄的程序通读过了,写的非常好。思想也很好。只是有两个小毛病:delete_memory函数里有定义变量没有使用的情况;MC_realloc函数里有一个循环的判断条件少了一个。整体来说,写的非常好。尤其是想法!
to x..........[/quote:2a8da6b58e]
--------------------------------------------------------------
谢谢!
我写了一个比较大的程序,运行的时候内存总是往上长。我开始查找源代码。可是代码较长。找起来很麻烦。所以临时写了这个检查内存的程序。只为自己当时使用。

这个检查内存的程序效率很低。因为里面涉及到顺序搜索。

现在我正想怎么样获得内存读写溢出的问题。当内存读写溢出的时候,我想获得源代码的文件名和行号。不过到现在还没有想起来。

如果大家谁有好的想法。望不吝赐教!。最好不要涉及到汇编。
----------------------------

 FH 回复于:2004-04-02 17:12:03
俺就不用这些东西,照样不会有任何内存残留,养成良好的编程习惯才是最重要的。
[code:1:dcfc025925]const char *ErrMsg = "Can't alloc memory";

if ( ( p = malloc( size ) ) != NULL ) {
   ErrMsg = subfunction();
   free( p );
}
return ErrMsg;[/code:1:dcfc025925]

 aero 回复于:2004-04-02 17:15:01
FH说的对,C就是这样灵活的美丽。

 win_hate 回复于:2004-04-02 18:45:21
zkyguanl  的代码很非常好,很实用。设为精彩。


to zkyguanl:

优秀的代码你已经有了,祝你早日实现第一个追求。。。 :D

 parady 回复于:2004-04-02 19:06:32
zkyguanl的程序写得很漂亮.我顶一下!

 birdielu 回复于:2004-04-02 19:12:01
恩,看了上面的代码,感觉真得非常的不错,很有实用性,我顶.

 magiccpp 回复于:2004-04-02 19:26:44
弟兄们可以找dmalloc 来看看,他的代码写得很好,而且代码量不大。适合学习,呵呵

 xhl 回复于:2004-04-02 19:49:30
回家了,在顶下,今天一定把zkyguanl的程序调出来,呵呵

 saoyu 回复于:2004-04-02 21:35:31
mtrace

 xhl 回复于:2004-04-02 23:17:05
[quote:6229e13baf="magiccpp"]弟兄们可以找dmalloc 来看看,他的代码写得很好,而且代码量不大。适合学习,呵呵[/quote:6229e13baf]

dmalloc是什么东西,望指教

 magiccpp 回复于:2004-04-03 05:32:43
http://dmalloc.com/
是一个不错的调试小工具,协助你找出泄漏所在
malloc  calloc 等显示调用可以直接找到申请资源的行号
strdup 等隐式申请内存调用可以报告泄漏的内存,
其机理与MFC中的内存检测有一点类似,但是我学习MFC的内存检测源码,发现有一部分代码是没有开放的,所以只好学习dmalloc 了,dmalloc比较容易学习。代码量只有不到20000行。
偶一直用着

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有