malloc前十六个字节中怎么体现分配内存大小的
rt。知道编译器在分配内存时,前面预留了16个字节(这是win下,linux下应该一样)。编译器在分配内存时,分配给用户的地址减去16个字节,保存了分配内存的类型与大小
vs调试时发现如下规律
【1】第一顺序的四个字节代表分配内存大小(注意是单位数,而非内存总字节数),并以小端(跟cpu有关)方式呈现,在32位处理器或者32位操作系统下,程序所能允许分配最大内存为2^32次幂;
【2】第二顺序的四个字节不清楚代表什么
【3】第三顺序的四个字节代表分配数据类型,猜测
7a--char
7b--short
7c--int
7d--long
7e--float
7f--double
【4】第四顺序的四个字节都为fd,猜测默认为保留字节
疑问:如何从上面的资料计算申请分配内存的大小
所分配内存个数在第一顺序的四个字节中有体现,但是所分配内存的单个单元大小几何单从第三顺序的四个字节看不出所以然。再分析下第三顺序的四个字节,对应【总结3】,略加分析,会发现单个单元大小也对应了某个值。我试了下不同结构体对应的值也各不一样。猜测vs编译器对其单个单元值在编译时进行了计算,以便于在释放内存时清楚该释放内存大小,但是不知道是否是有规律的。 shiqgnefu 发表于 2014-12-11 15:15 static/image/common/back.gif
rt。知道编译器在分配内存时,前面预留了16个字节(这是win下,linux下应该一样)。
严重怀疑。 楼主这东西是从哪看到的?书上还是网上? 我记得malloc分配的时候,前面会预留出4个字节(具体是几个字节不确定),用于标记这块内存的长度,在free的时候使用
回复 2# MMMIX
你的怀疑是正确的,试了,gcc跟vs不一样 回复 3# super皮波
忘了,瞎看,然后用vs调试跟踪。gcc跟vs不一样,不知道其怎么管理内存的
回复 4# super皮波
我用gdb调试gcc编译程序发现也不是使用内存地址前4个字节
已经找到glibc下相关资料,glibc在分配内存前增加了一个 HEADER_SIZE ,跟踪malloc函数实现可以发现
typedef struct header {
long check;
union {
struct header *next;
struct free_list *fl;
} u;
} *header_t;
#define HEADER_SIZE sizeof (struct header)
typedef struct free_list {
spin_lock_t lock; /* spin lock for mutual exclusion */
header_t head; /* head of free list for this size */
#ifdef DEBUG
int in_use; /* # mallocs - # frees */
#endif /* DEBUG */
} *free_list_t;
页:
[1]