shiqgnefu 发表于 2014-12-11 15:15

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编译器对其单个单元值在编译时进行了计算,以便于在释放内存时清楚该释放内存大小,但是不知道是否是有规律的。

MMMIX 发表于 2014-12-12 16:35

shiqgnefu 发表于 2014-12-11 15:15 static/image/common/back.gif
rt。知道编译器在分配内存时,前面预留了16个字节(这是win下,linux下应该一样)。


严重怀疑。

super皮波 发表于 2014-12-12 17:17

楼主这东西是从哪看到的?书上还是网上?

super皮波 发表于 2014-12-12 17:20

我记得malloc分配的时候,前面会预留出4个字节(具体是几个字节不确定),用于标记这块内存的长度,在free的时候使用

shiqgnefu 发表于 2014-12-15 10:29

回复 2# MMMIX


    你的怀疑是正确的,试了,gcc跟vs不一样

shiqgnefu 发表于 2014-12-15 10:29

回复 3# super皮波

忘了,瞎看,然后用vs调试跟踪。gcc跟vs不一样,不知道其怎么管理内存的
   

shiqgnefu 发表于 2014-12-15 10:31

回复 4# super皮波

我用gdb调试gcc编译程序发现也不是使用内存地址前4个字节
   

shiqgnefu 发表于 2014-12-16 16:23

已经找到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]
查看完整版本: malloc前十六个字节中怎么体现分配内存大小的