malloc(0)
2015-08-01 14:54
197 查看
原来...
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内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:
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内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:
相关文章推荐
- DESTOON 新增模块的方法
- Java测试工具和框架
- KVC 与 KVO
- poj-3083 Children of the Candy Corn-DFS+BFS
- Servlet实现用户数的统计
- windows的socket_tcp客服端端与linux的socket_tc服务端简单通讯
- HDU 5224 Tom and paper(最小周长)
- USB 3G dongle E303在android4.4上的移植支持
- Bootstrap组件之媒体对象
- 微软沈向洋:计算机视觉未来在语义层 “两大一精”是关键
- Android实现网络多线程断点续传下载原理
- 机试算法讲解: 第49题 动态规划之最长递增子序列问题
- java基本算法题及答案
- Java线程中run和start方法的区别
- 【剑指Offer面试题】 九度OJ1523:从上往下打印二叉树
- 黑马程序员——java学习9(毕15-16)——TreeSet、Map、泛型、字符排序
- 怎样才是理想的程序员
- zoj 1951 Goldbach's Conjecture(素数筛选继续水)
- LA3357 Pinary (递推)
- MVC4 引用DLL 成功越狱实体模型 自由调用存储过程 自由传递参数