xxNote

本文链接:http://www.cnblogs.com/xxNote/p/4009359.html

今天看书的时候看到free函数释放动态申请的内存时只需要把内存块的首地址传过去就行了,显然仅仅依靠首地址是无法确定要释放多少内存的,猜想应该在某处存放着这个内存块的大小,网上搜了搜发现在Linux里面glibc在分配内存的时候会在内存块的地址前面的4个字节出存放内存块的大小,就猜想Windows里面应该也是这样。写了一个小程序测试了下:

#include <stdio.h>
#include <STDLIB.H>

int main(void)
{
	int *p = (int *) malloc(10 * sizeof(int));
	*p = 1;
	free(p);

	return 0;
}

运行调试,先找到这个内存块的地址:

现在看一下内存:

由于申请了40个字节大小的内存块,转换成16进制就是0x00000028,在内存中就是28 00 00 00 ,看一下上图可以发现内存块首地址之前的16个字节处和猜想中的结果一样,接下来申请一个400字节大小的内存块,转换成16进制就是0x00000190,在内存中就是90 01 00 00,再看一下运行的结果:

依然和推测出的结果一样,可见Windows里面当我们使用free函数释放内存的时候,函数会把内存块的首地址加上16,从这个位置就可以找到内存块的大小。

 

分类:

技术点:

相关文章:

  • 2021-08-22
  • 2021-12-10
  • 2021-05-20
  • 2021-08-15
  • 2022-12-23
  • 2021-12-05
  • 2022-12-23
  • 2021-08-24
猜你喜欢
  • 2021-12-10
  • 2021-09-26
  • 2021-08-04
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
相关资源
相似解决方案