- 论坛徽章:
- 0
|
Re: 如何判断指针指向的内存是否被释放掉
原帖由 isnowran 于 2006-4-28 17:30 发表
自定义一个函数来保证指针释放后为空
- void Free( char*& p )
- {
- if( NULL != p )
- {
- free( p );
- p = NULL;
- }
- }
- int main()
- {
- char *p = (char*)malloc(10);
- Free( p );
- char * pp = p;
- }
复制代码
那还不如定义下面的宏:
#define Free(p) do { free(p); p = NULL; } while(0)
但解决不了楼主的问题, 我理解他真正的问题是类似这样的情形:
- extern char * global_p;
- int main()
- {
- char *p = malloc(10);
- global_p = p;
- free(p); //这里即使释放了, 或者再把p重设为NULL, 也不影响global_p中的值.
- foo();
- return 0;
- }
- void foo()
- {
- if( global_p point to a valid memory or already be freed)
- {... }
- }
复制代码
另一个办法是建立一个全局范围的表, 保存着所有分配过的内存地址, 每次分配就记上一笔, 每次释放就删掉它. 但代价可能稍大一些, 因为每次分配和释放都需要做这个表的维护工作:
附件里的代码提供了C标准库里 malloc, calloc, realloc, free 4个内存管理函数(注意象GCC的实现中提供的在栈上分配内存的alloca不是标准库中的函数, 因为它在栈上分配, 也不需要释放) 的包装版本, 另加上了一个
判断内存是否被释放的函数, 原型如下:
- void * my_malloc( size_t size);
- void * my_calloc( size_t n, size_t size);
- void * my_realloc(void * const memblock, size_t size );
- int my_free(void * const p);
- int my_isok(void * const p);
复制代码
用以下的代码在GCC3.3.3和VC7下测试通过:
- #include <stdio.h>
- #include <stdlib.h>
- #include "my_mem.h"
- int main(int argc, char ** argv)
- {
- char *p2;
- char *p = my_malloc( 100 );
- printf("%d \n", my_isok( p) );
- *p2 = p;
- my_free( p);
- printf("%d \n", my_isok( p2 ) );
- return 0;
- }
复制代码
[ 本帖最后由 slimzhao 于 2006-5-1 21:07 编辑 ] |
|