malloc的内存分配之 malloc(0)的内存分配情况
2015-11-10 13:19
417 查看
#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内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:
![](http://pic002.cnblogs.com/images/2011/316345/2011080915311345.gif)
相关文章推荐
- Codeforces 496C Removing Columns(暴力)
- XHTML学习<1>
- json数据发送时浏览器提示“保存”解决
- Xamarin.Android 里面的通知
- js倒计时 重发 效果
- Nova Liberty blueprints
- Java上的try catch并不影响性能(转)
- 黑马程序员_java多线程的同步和死锁
- CASE WHEN 及 SELECT CASE WHEN的用法
- js倒计时 重发 效果
- 中国安卓
- POJ 1008-Maya Calendar-模拟
- coins in a line
- SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)
- gem install报错
- SQL Server 2008 R2 企业版/开发版/标准版(中英文下载,带序列号)
- oracle 语法总结
- 初识c++,复数类
- Codeforces 496B Secret Combination(最小表示法)
- CDC、HDC、pDC