关于 malloc 函数和free 函数

来源:互联网 发布:dorado js怎么调试 编辑:程序博客网 时间:2024/05/16 05:40

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8052128 


1. malloc 函数原型

void* malloc(unsigned int num_bytes);


函数接受一个无符号整形参数,表示需要申请的动态内存字节数; 返回值为void指针,一般往往需要强制类型转换,比如转为 char*。如果申请失败则返回 NULL。

2. malloc 的参数
大多数情况下,不要手动指定具体数值,比如如果希望申请 128 个int 长度的缓冲区,一般写作:

malloc(128*sizeof(int) );


这么写的好处有两点,一是系统无关,不必考虑在什么样的计算机上,int究竟占用几个字节(比如16、32位的计算机上int分别占2、4byte的区别,32、64位计算机的long分别占4、8 byte的区别); 二是语义明确,如果你写成 malloc(512),后面维护的时候,往往忘记这个究竟用来存储128个int呢,还是512个char。

3. malloc vs. new operator
c++ 的 new 至少与 malloc 有三点不同:
一是返回类型确定。二是自动计算实际内存空间的大小。三是内存自动初始化

举例说,比如申请 10 个 int 的 buffer,可以写成:

int* buf=new int[10];



也可以写成:

int* buf=(int*)malloc(10*sizeof(int) );


如前所述,new 不需要 (int*) 类型转换,也不需要手动 sizeof(int) 计算。同时, buf 指向的内存运行时会自动初始化为默认值, 注意,malloc 得到的内存,其数据是任意的,没有初始化。

这么一说, malloc 可以等价于 operator new(不是 new operator)。可以参考:

http://blog.csdn.net/zhangxaochen/article/details/8033503

4. malloc 用法规范

type* ptr;if(NULL==(ptr=(type*)malloc(sizeof(type))) ){ err("error happened"); exit(1);}//do something....free(ptr);ptr=NULL;


5. 关于 malloc(0)
 linux 下允许 malloc(0) 这样的写法,因为 它默认限定了 malloc的下限为 16byte。 而像是 malloc(-1) 这样的写法是错误的

==========================================================
再谈 free:
1. free 原型:

void free(void* p);


2. free 释放内存,但不修改指针的值
 上面也提到过这样的代码:

free(ptr);ptr=NULL;


free 释放了 ptr 指向的内存,但是ptr指向的地址并没有改变,所以使用 “ptr=NULL;” 来清空ptr,以免在之后误用 ptr而产生难以察觉的bug

3. free 如何释放内存? 怎么知道要释放的内存的长度?
存在即合理,malloc 肯定多做了什么。。。
传说 malloc 实际申请的内存,比传参时指定的内存要大一点。多了的内存存储了这样一个结构体:

struct mem_control_block {    int is_available;    //这是一个标记?    int size;            //这是实际空间的大小};


is_available 解释下, 它告诉系统此内存是否可重新使用,比如 is_available=1; 就是把内存标记为 系统可用的。看下面代码,据说是free 的函数实现:

void free(void *ptr){        struct mem_control_block *free;        free = ptr - sizeof(struct mem_control_block);        free->is_available = 1;        return;}


free 函数做了什么? 它并没有直接做“抹掉堆内存数据”之类的事情,仅仅是找到 mem_control_block 的位置, 标记 is_available=1, 就是申明“这块内存我不用了,系统可以收回去给别人用”这样简单的事情。而系统可以根据 mem_control_block 里的 size 记号判定收回多少字节的内存。
 

 原文链接:http://blog.csdn.net/zhangxaochen/article/details/8052128

{{OVER}}

原创粉丝点击