| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1317 人关注过本帖
标题:系统是如何区分已分配内存,和未分配内存的?
只看楼主 加入收藏
go_hao
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2009-10-9
结帖率:11.11%
收藏
 问题点数:0 回复次数:6 
系统是如何区分已分配内存,和未分配内存的?
系统是如何区分已分配内存,和未分配内存的?
比如用new分配出内存,用指针 p 指向它,然后再次delete这块内存,
我发现,

*p取值的话,前后的值是不同的。
我不理解,因为delete是释放那块内存,但是并没有改写这块内存呀,为何取值会不同呢?

当然,你会说,释放的空间是不能用的,这个我也知道,我就是想明白一下,释放了的空间,在内存块不被改写的情况下,为何用同一个物理指针取它的值的话,值却真的变了,这是为什么呢?

#include <iostream>
using namespace std;

int main()
{
    int *a=new int;
    *a=90;
    cout < < "值为:" < < *a < < endl;
    cout < < "地址为:" < < a < < endl;
    delete a;
    cout < < "值为:" < < (int)*a < < endl;  //此时值已经变了(release版本照样变)
    cout < < "地址为:"  < < a < < endl;
   
    cin.get();
    return 0;
}
搜索更多相关主题的帖子: 系统 内存 
2009-11-06 16:48
最左边那个
Rank: 4
等 级:业余侠客
威 望:3
帖 子:97
专家分:201
注 册:2009-4-24
收藏
得分:0 
首先看了很久,还是不太确定你在问什么!不过还是能解释一点!
int *a=new int   开辟了一个int的空间,它的地址是a
    cout < < "值为:" < < *a < < endl;
    cout < < "地址为:" < < a < < endl;
那么上面两句毫无疑问!
delete a以后,就是把a指向的空间释放了,里面已经没什么内容了!
但是空间的地址还是在的!
所以cout < < "值为:" < < (int)*a < < endl,居然空间里没东西,那么系统就会胡乱读出一些东西出来!
cout < < "地址为:"  < < a < < endl,这个没变,是因为delete a,释放的是空间,不是地址,而单纯对地址操作还是可以的!

个人理解,如果有什么不对的地方,还请指教!
2009-11-06 18:15
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
销毁这个词比释放更贴切(一本好像叫《C++陷阱》的书里说的)delete是销毁了所对应new申请空间里的内容。
我用VC++写了几行代码看了下,被改的挺有规律的。110111011101110...

迭代的是人,递归的是神。
2009-11-06 19:45
go_hao
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2009-10-9
收藏
得分:0 
以下是引用最左边那个在2009-11-6 18:15:01的发言:

首先看了很久,还是不太确定你在问什么!不过还是能解释一点!
int *a=new int   开辟了一个int的空间,它的地址是a
    cout < < "值为:" < < *a < < endl;
    cout < < "地址为:" < < a < < endl;
那么上面两句 ...
谢谢,不过我问的真不是这个,我是问,我释放的那块内存,我没有重写的,为何内容会变。
因为delete后,我再次访问那个物理地址存放有值,确实变了。
2009-11-06 22:32
最左边那个
Rank: 4
等 级:业余侠客
威 望:3
帖 子:97
专家分:201
注 册:2009-4-24
收藏
得分:0 
回复 4楼 go_hao
delete a以后,就是把a指向的空间释放了,里面已经没什么内容了!
但是空间的地址还是在的!
所以cout < < "值为:" < < (int)*a < < endl,居然空间里没东西,那么系统就会胡乱读出一些东西出来!

这就是解释啊
2009-11-07 11:55
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
在C、C++库级,都提供了自己的‘堆’管理函数。你请求分配的动态内存在‘堆’上被分配后,管理函数会在内部表示该块内存被使用。这样你没有释放,就不会被再次分配。
一旦你释放了这块内存,堆内存管理函数会视当前‘堆’的使用情况将其回收(取消内部表示该块内存被使用)。如果你当前使用的是Debug版本的库,在该块内存会被填写固定标示值,以方便调试器的跟踪。如果是release版本,其值会根据‘堆’管理器的回收算法不同而不同。


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-11-07 17:01
go_hao
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2009-10-9
收藏
得分:0 
以下是引用东海一鱼在2009-11-7 17:01:13的发言:

在C、C++库级,都提供了自己的‘堆’管理函数。你请求分配的动态内存在‘堆’上被分配后,管理函数会在内部表示该块内存被使用。这样你没有释放,就不会被再次分配。
一旦你释放了这块内存,堆内存管理函数会视当前‘ ...
看来您真是高手呀,虽然我还是不明白,但是我已经知道,这个太深了,我现在还没有能力去了解其机理。
2009-11-07 22:11
快速回复:系统是如何区分已分配内存,和未分配内存的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018063 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved