Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543989
  • 博文数量: 99
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1117
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-23 15:17
文章分类

全部博文(99)

文章存档

2011年(4)

2010年(13)

2009年(82)

我的朋友

分类: LINUX

2010-03-18 11:15:08

glibc中malloc的原理:

glibc中的内存动态分配时通过一个结构来实现的

struct malloc_chunk
{
INTERNAL_SIZE_T prev_size; /* 如果前一个结构未使用则把这个填充为前一结构的size*/
INTERNAL_SIZE_T size; /* 本结构的size,最小16(本结构的大小),因为是8字节对齐,最后的三位用来做标记位 PREV_INUSE(最后一位用来标记前一结构是否使用)  IS_MMAPPED 用来标记此内存块是不是由mmap()分配在free中会用到*/
struct malloc_chunk* fd; /* 如果本结构未使用则由fd bk双向链表来填充,如果使用则是malloc/alloc/realloc的返回首地址 */
struct malloc_chunk* bk;
};

#include
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐


void getPSize(void * p)
{
 int size = chunksize(p);
 printf("malloc size is %d",size - 8);
}

//下面这种方法也是可以的

#include
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))
typedef unsigned int INTERNAL_SIZE_T;
#define SIZEOF2INTERNAL_SIZE_T 2*sizeof(INTERNAL_SIZE_T)
struct malloc_chunk
{
INTERNAL_SIZE_T prev_size; /* 如果前一个结构未使用则把这个填充为前一结构的size*/
INTERNAL_SIZE_T size; /* 本结构的size,最小16(本结构的大小),因为是8字节对齐,最后的三位用来做标记位 PREV_INUSE(最后一位用来标记前一结构是否使用)  IS_MMAPPED 用来标记此内存块是不是由mmap()分配在free中会用到*/
struct malloc_chunk* fd; /* 如果本结构未使用则由fd bk双向链表来填充,如果使用则是malloc/alloc/realloc的返回首地址 */
struct malloc_chunk* bk;
};

#define ChunkSize(p) ((struct malloc_chunk *)(p-SIZEOF2INTERNAL_SIZE_T))->size & ~(SIZE_BITS)

void getPSize(void * p)
{
 //int size = chunksize(p);
 int size = ChunkSize(p);
 printf("malloc size is %d",size - 8);
}
int main()
{
 unsigned char * p = malloc(0x50);
 int size = chunksize(p);
 char mm[100];
 char * mmp = mm;
 getPSize(p);free(p);
 return 0;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eqxu/archive/2007/06/12/1648658.aspx

#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐



void getPSize(void * p)
{
 int size = chunksize(p);
 printf("malloc size is %d",size - 8);
}


#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐



void getPSize(void * p)
{
 int size = chunksize(p);
 printf("malloc size is %d",size - 8);
}


#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐



void getPSize(void * p)
{
 int size = chunksize(p);
 printf("malloc size is %d",size - 8);
}


#include <malloc.h>
#define PREV_INUSE 0x1
#define IS_MMAPPED 0x2
#define SIZE_BITS PREV_INUSE|IS_MMAPPED
#define chunksize(p) (*(((unsigned int *)p)-1) & ~(SIZE_BITS))//取出size去掉后两标志位影响,8字节对齐



void getPSize(void * p)
{
 int size = chunksize(p);
 printf("malloc size is %d",size - 8);
}


阅读(3791) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~