您的位置:首页 > 其它

为什么不能越界访问malloc分配的内存

2014-07-04 14:15 344 查看
写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!

如果发现一些笔记的说法完全是错误的请建议我删除!

malloc分配堆内存空间,malloc自己管理一个链表用来维护堆中的内存(这种维护可以管理内存碎片,可以提高内存的利用率),由于malloc通过链表来维护,就必不可少的会利用空间来存放next指针域,这个next指针域就紧紧的挨着malloc分配的内存的后面,如果越界访问malloc分配的内存空间就会破坏next域,从而破坏了链表结构于是就会Abort!

通过程序验证

<pre name="code" class="cpp">#include<iostream>
#include<cstdlib>
#include<unistd.h>
using namespace std;

int main()
{
int *p = static_cast<int *>(malloc(4));
int *pp = static_cast<int *>(malloc(4));
*p = 1;
//    *(p+1) = 2;
//    *(p+2) = 3;
//    *(p+3) = 4;
*(p+5) = 2;
*(p+6) = 3;
*(p+7) = 4;
cout << "*p = " << *p <<endl;
cout << "*(p+1) = "<< *(p+1) <<endl;
cout << "*pp = "<< *pp <<endl;
cout <<"*(pp+1) = "<< *(pp+1)<< endl;
free(p);
p = NULL;
//    cout<<"(*p) = "<<*p<<endl;
return 0;
}




如果去掉前三个注释符中的任意一个,程序就会被中止,可以看出malloc确实在被分配的内存的后面存放了一些用于维护内存的信息,如果被破坏程序就会中止。
问题:
*malloc分配得到的内存一定需要被free吗?
*free掉的指针就一定不能被访问了吗?
*如果说只有被映射的逻辑地址(虚拟地址)才能被访问,那么*(p+4),*(p+5)这样的访问不会报错?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存
相关文章推荐