免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4430 | 回复: 28
打印 上一主题 下一主题

求助:为何还能访问delete之后的空间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-19 10:31 |只看该作者 |倒序浏览
先看两段代码,引出对下面问题的思考:
  代码段1:  
  #include <iostream>
  using namespace std;
  int main()
{
   int * p = new int;
   delete p;
   *p = 3;
   cout<<*p<<endl;
   p= p+100;
   *p = 4;
   cout<<p<<endl;
   cin.get();
   return 0;
}

运行结果为:3    0x33f38  后一个输出地址

#include <iostream>
  using namespace std;
  int main()
{
   int * p = new int;
   delete p;
   *p = 3;
   cout<<*p<<endl;
   p= p+200;
   *p = 4;
   cout<<p<<endl;
   cin.get();
   return 0;
}

编译运行会出现运行时错误

想引出的问题是这样的,为何动态申请的内存被释放掉之后还可以对其进行访问?delete操作到底做了什么事情?
由于p是指向进程的堆空间,为何对地址为p+100的内存块可以访问,而对地址为p+200的内存块访问时就有问
题?系统为进程分配的堆大小不可能小于1K,而p到p+200的地址空间还不足1K,该进程又没有其它的堆内存使用.

论坛徽章:
0
2 [报告]
发表于 2006-05-19 17:30 |只看该作者
delete只是告诉系统这块空间可以再次被使用,安全的做法是delete之后,再把指针给NULL掉。

论坛徽章:
0
3 [报告]
发表于 2006-05-19 22:14 |只看该作者
但是delete这块内存之后,是否就说明这块内存不再属于这个进程的地址空间了?
如果不属于该进程的地址空间的话,访问的时候是会出现错误的,比如像access denied这类错误!

论坛徽章:
1
射手座
日期:2013-09-13 16:09:25
4 [报告]
发表于 2006-05-19 22:21 |只看该作者
原帖由 coldplus 于 2006-5-19 17:30 发表
delete只是告诉系统这块空间可以再次被使用,安全的做法是delete之后,再把指针给NULL掉


有道理!

论坛徽章:
1
射手座
日期:2013-09-13 16:09:25
5 [报告]
发表于 2006-05-19 22:23 |只看该作者
原帖由 _Erics 于 2006-5-19 22:14 发表
但是delete这块内存之后,是否就说明这块内存不再属于这个进程的地址空间了?
如果不属于该进程的地址空间的话,访问的时候是会出现错误的,比如像access denied这类错误!


这个是不是跟系统的内存保护有关哦???

论坛徽章:
0
6 [报告]
发表于 2006-05-20 08:25 |只看该作者
字符串被free之后好像也可以被访问。。也是这个原因么?

论坛徽章:
0
7 [报告]
发表于 2006-05-21 13:10 |只看该作者
因为内存还在堆里面,没有归还给系统。
你们的疑问说明了为什么操作系统都是C写的,而不是C++。

论坛徽章:
0
8 [报告]
发表于 2006-05-21 18:53 |只看该作者
因为内存还在堆里面,没有归还给系统。
你们的疑问说明了为什么操作系统都是C写的,而不是C++。


赞同JohnBull的第一个观点,但是对第二个观点不是很理解:
我写了一个类似的C程序,把new和delete改成了malloc和free,
但是free之后的内存空间还是可以被访问的。
看来要补一下libc对进程堆内存的管理了

论坛徽章:
0
9 [报告]
发表于 2006-05-22 09:06 |只看该作者
楼主,我编译的2个都没有出现错误。RH4.0的系统。

论坛徽章:
0
10 [报告]
发表于 2006-05-22 09:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP