miranda内存分配机制
2007-07-12 18:18
337 查看
Miranda里使用专门的函数分配和释放内存,分配内存的时候总是在前面多分配三个DWORD(12 bytes),
第一个DWORD用于存储内存块的大小(不包括这三个附加的DWORD)
第二个和第三个DWORD用于描述这块内存的使用状态:BLOCK_ALLOCED 或 BLOCK_FREED
void* mir_alloc( size_t size )
{
if ( size == 0 )
return NULL;
{
char* p = (char*)malloc( size + sizeof(DWORD)*3 );
if ( p == NULL ) {
OutputDebugStringA( "memory overflow/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
return NULL;
}
*( DWORD* )p = ( DWORD )size;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_ALLOCED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_ALLOCED;
return p + sizeof( DWORD )*2;
}
}
void mir_free( void* ptr )
{
char* p;
DWORD size;
if ( ptr == NULL )
return;
if ( !CheckBlock( ptr ))
return;
p = ( char* )ptr - sizeof(DWORD)*2;
size = *( DWORD* )p;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_FREED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_FREED;
free( p );
}
void* mir_realloc( void* ptr, size_t size )
{
char* p;
if ( ptr != NULL ) {
if ( !CheckBlock( ptr ))
return NULL;
p = ( char* )ptr - sizeof(DWORD)*2;
}
else p = NULL;
p = ( char* )realloc( p, size + sizeof(DWORD)*3 );
if ( p == NULL ) {
OutputDebugStringA( "memory overflow/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
return NULL;
}
*( DWORD* )p = ( DWORD )size;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_ALLOCED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_ALLOCED;
return p + sizeof( DWORD )*2;
}
static int CheckBlock( void* blk )
{
int result = FALSE;
char* p = ( char* )blk - sizeof(DWORD)*2;
DWORD size, *b, *e;
__try
{
size = *( DWORD* )p;
b = ( DWORD* )&p[ sizeof( DWORD ) ];
e = ( DWORD* )&p[ sizeof( DWORD )*2 + size ];
if ( *b != BLOCK_ALLOCED || *e != BLOCK_ALLOCED )
{
if ( *b == BLOCK_FREED && *e == BLOCK_FREED )
OutputDebugStringA( "memory block is already deleted/n" );
else
OutputDebugStringA( "memory block is corrupted/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
}
else result = TRUE;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
OutputDebugStringA( "access violation during checking memory block/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
}
return result;
}
第一个DWORD用于存储内存块的大小(不包括这三个附加的DWORD)
第二个和第三个DWORD用于描述这块内存的使用状态:BLOCK_ALLOCED 或 BLOCK_FREED
void* mir_alloc( size_t size )
{
if ( size == 0 )
return NULL;
{
char* p = (char*)malloc( size + sizeof(DWORD)*3 );
if ( p == NULL ) {
OutputDebugStringA( "memory overflow/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
return NULL;
}
*( DWORD* )p = ( DWORD )size;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_ALLOCED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_ALLOCED;
return p + sizeof( DWORD )*2;
}
}
void mir_free( void* ptr )
{
char* p;
DWORD size;
if ( ptr == NULL )
return;
if ( !CheckBlock( ptr ))
return;
p = ( char* )ptr - sizeof(DWORD)*2;
size = *( DWORD* )p;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_FREED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_FREED;
free( p );
}
void* mir_realloc( void* ptr, size_t size )
{
char* p;
if ( ptr != NULL ) {
if ( !CheckBlock( ptr ))
return NULL;
p = ( char* )ptr - sizeof(DWORD)*2;
}
else p = NULL;
p = ( char* )realloc( p, size + sizeof(DWORD)*3 );
if ( p == NULL ) {
OutputDebugStringA( "memory overflow/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
return NULL;
}
*( DWORD* )p = ( DWORD )size;
*( DWORD* )&p[ sizeof(DWORD) ] = BLOCK_ALLOCED;
*( DWORD* )&p[ size + sizeof(DWORD)*2 ] = BLOCK_ALLOCED;
return p + sizeof( DWORD )*2;
}
static int CheckBlock( void* blk )
{
int result = FALSE;
char* p = ( char* )blk - sizeof(DWORD)*2;
DWORD size, *b, *e;
__try
{
size = *( DWORD* )p;
b = ( DWORD* )&p[ sizeof( DWORD ) ];
e = ( DWORD* )&p[ sizeof( DWORD )*2 + size ];
if ( *b != BLOCK_ALLOCED || *e != BLOCK_ALLOCED )
{
if ( *b == BLOCK_FREED && *e == BLOCK_FREED )
OutputDebugStringA( "memory block is already deleted/n" );
else
OutputDebugStringA( "memory block is corrupted/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
}
else result = TRUE;
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
OutputDebugStringA( "access violation during checking memory block/n" );
#if defined( _DEBUG )
DebugBreak();
#endif
}
return result;
}
相关文章推荐
- Android(安卓)内存分配机制详解 不需要关闭后台运行程序
- java 内存分配机制
- Windows内存管理机制及C++内存分配实例(三):虚拟内存
- Memcached 内存分配机制介绍
- C语言内存、存储机制、计算机内存分配机制
- slab alloc内存分配机制
- Java深入 - Java 内存分配和回收机制
- Java内存分配机制和GC回收机制
- AIX 中的内存分配机制
- linux 内存分配机制
- C++ vector内存分配机制
- 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
- Memcached 内存分配机制介绍
- .NET下的内存分配机制
- Java内存分配及垃圾回收机制
- 全面介绍Windows内存管理机制及C++内存分配实例之虚拟内存(4)
- 全面介绍Windows内存管理机制及C++内存分配实例
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 内存管理机制-内存分配策略
- Java中变量内存分配机制