关于 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}}
- 关于 malloc 函数和free 函数
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- 关于malloc和free函数的用法
- malloc函数和free函数
- malloc函数和free函数
- malloc函数和free函数
- malloc函数和free函数
- malloc函数和free函数
- 关于malloc函数和free函数的一些总结
- malloc 和 free函数浅谈
- Alpha Matting Evaluation
- Android版Chrome正式支持英特尔x86架构智能机
- Writing-Efficient-C-and-C-Code-Optimization
- 按set部署的小结
- ALSA 0.9.0 HOWTO---基本PCM音频
- 关于 malloc 函数和free 函数
- 设置mapreduce的job的优先级的两种方法
- windows 下 安装svn服务器
- 转:SetConsoleCtrlHandler 处理控制台消息
- [VC++]配置文件读取
- vc如何在MSflexgrid表格的最后一行增加一行数据
- 带命令行参数的main函数详解[转载]
- 用实例给新手讲解RSA加密算法
- flash 3d示例