为什么不能越界访问malloc分配的内存
2014-07-04 14:15
344 查看
写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!
如果发现一些笔记的说法完全是错误的请建议我删除!
malloc分配堆内存空间,malloc自己管理一个链表用来维护堆中的内存(这种维护可以管理内存碎片,可以提高内存的利用率),由于malloc通过链表来维护,就必不可少的会利用空间来存放next指针域,这个next指针域就紧紧的挨着malloc分配的内存的后面,如果越界访问malloc分配的内存空间就会破坏next域,从而破坏了链表结构于是就会Abort!
通过程序验证
如果去掉前三个注释符中的任意一个,程序就会被中止,可以看出malloc确实在被分配的内存的后面存放了一些用于维护内存的信息,如果被破坏程序就会中止。
问题:
*malloc分配得到的内存一定需要被free吗?
*free掉的指针就一定不能被访问了吗?
*如果说只有被映射的逻辑地址(虚拟地址)才能被访问,那么*(p+4),*(p+5)这样的访问不会报错?
如果发现一些笔记的说法完全是错误的请建议我删除!
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)这样的访问不会报错?
相关文章推荐
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- C++为什么不建议使用malloc,calloc,realloc来分配内存?
- 究竟为什么内网不能用外网地址访问内部服务器。通俗详细的解释
- 挑战malloc极限,看看你的系统有多大的内存分配能力
- 内存分配访问无效。 998 错误提示
- DLL为什么使用完毕后会提示:内存访问错误呢?
- Java网络编程从入门到精通(3):为什么不能直接通过IP访问网站
- 内存分配方式,堆区,栈区,new/delete/malloc/free
- 请教一下:Windows任务管理器中显示的进程占用的内存是什么内存? 分配的还是使用的? 另外,最小化一个进程的时候为什么其占用的内存会大大降低?谢谢
- csdn为什么不能访问?
- 问题:为什么本例中c++析构函数不能正确释放内存及析构
- Java网络编程从入门到精通(3):为什么不能直接通过IP访问网站
- 为什么Tomcat的webapps目录下新建的目录不能访问html文件?
- 浅谈对象的内存分配及对象的成员的访问(一)
- 为什么会经常出现"0X00000010"指令,该内存不能为"read或Write"
- 写的不错 不能回避的话题: 内存分配 (转)
- 挑战malloc极限,看看你的系统有多大的内存分配能力
- 998 内存分配访问无效 loadlibrary
- 浅谈对象的内存分配及对象的成员的访问(三)--方法的内存分配
- DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。