天天看点

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

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

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

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)这样的访问不会报错?

继续阅读