| 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行。
偶一直用着
|