malloc(0)
2016-07-08 09:06
357 查看
malloc的内存分配之 malloc(0)的内存分配情况
#include<iostream>
using namespace std;
int main()
{
char *p;
if((p=(char *)malloc(0))==NULL)
puts("got a null pointer");
else
puts("got a valid pointer");
}
答案:got a valid pointer
首先:
在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间。
其次:
不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B),因为malloc需要用这部分空间来维护堆上的内存块链表。所以当用户申请一块0B的空间时,malloc实际分配的空间是8B,如果用户申请的空间是X,则malloc实际分配的空间是(对齐(X) + 8)。这也是为什么malloc分配的空间千万不能越界使用的原因:堆的内部链表结构将被破坏。
另外对于new和delete malloc和free这样的内存分配与释放函数:到底delete和free是怎么知道要释放掉多少内存的呢?
其实在new和malloc内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/17/89eebe8c0aa34da724d50e32876b5800.png)
参考链接:http://www.cnblogs.com/this-543273659/archive/2011/08/03/2126153.html
#include<iostream>
using namespace std;
int main()
{
char *p;
if((p=(char *)malloc(0))==NULL)
puts("got a null pointer");
else
puts("got a valid pointer");
}
答案:got a valid pointer
首先:
在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间。
其次:
不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B),因为malloc需要用这部分空间来维护堆上的内存块链表。所以当用户申请一块0B的空间时,malloc实际分配的空间是8B,如果用户申请的空间是X,则malloc实际分配的空间是(对齐(X) + 8)。这也是为什么malloc分配的空间千万不能越界使用的原因:堆的内部链表结构将被破坏。
另外对于new和delete malloc和free这样的内存分配与释放函数:到底delete和free是怎么知道要释放掉多少内存的呢?
其实在new和malloc内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/17/89eebe8c0aa34da724d50e32876b5800.png)
参考链接:http://www.cnblogs.com/this-543273659/archive/2011/08/03/2126153.html
相关文章推荐
- 【bzoj2553】【beijing2008】【禁忌】【AC自动机+矩阵乘法】
- 从tcp原理角度理解Broken pipe和Connection reset by peer的区别
- 百度面试经验(1)
- EDD-SPT综合规则
- (转)Python编程语言的发展简史
- 文档无法保存。读取文档时出现问题(135)
- mmap将物理地址映射到用户空间
- JAVA MAIL发送邮件实例
- Zen Coding: 一种快速编写HTML/CSS代码的方法
- Memcache
- Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
- Mybatis实体类属性名与字段名不相同冲突_4
- Jackson框架的JsonGenerator、ObjectMapper - Json-lib框架的JsonObject、JsonArray
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
- spring源码分析之spring-core asm概述
- 工程部署到linux
- java中treemap和treeset实现(红黑树)
- 凸优化 - 2 - 凸集和凸函数
- [Effective JavaScript 笔记]第59条:避免过度的强制转换
- Java的Struts2框架中拦截器使用的实例教程