内存的概念

科比布莱恩特 2011-09-16 09:15:22
在程序中new了一个对象或类型,程序中不释放,退出程序时也不释放,那么当程序退出后,程序所new的那块内存还会在系统中存在么?
...全文
267 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
avcodec-decoder 2011-09-20
  • 打赏
  • 举报
回复
程序退出,内存释放
苍蝇①号 2011-09-20
  • 打赏
  • 举报
回复
我知道在linux下的用户空间进程退出时是肯定会释放内存的~~~~现在的os给进程分的是虚拟内存又不是物理内存,不用虚拟内存的系统很少很少了
康斯坦汀 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 kingskyleader 的回复:]

引用 21 楼 shiyunqiang 的回复:

程序退出,系统会自动回收。
你写java得吧
[/Quote]

java和C#具有内存回收机制,这个是指在运行过程中,程序退出,进程结束。
其未释放的内容会有操作系统回收,这个跟某种语言无关!
七擒关羽 2011-09-20
  • 打赏
  • 举报
回复
举个比较明显的比喻好了:
内存-黑板

一般你再黑板上写完字都会擦掉
如果下课,老师会布置一个人去擦掉
如果放学了,会有特定的人去擦黑板

这个在设计系统的时候都会考虑到的,如果你设计系统,会没有释放内存的机制吗?
Cielleech 2011-09-20
  • 打赏
  • 举报
回复
程序退出,本身进程所申请的内存被系统回收,new申请的内存也是进程申请的内存中分配的,所以也会被释放。
君子美玉 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 shiyunqiang 的回复:]

程序退出,系统会自动回收。
[/Quote]你写java得吧
君子美玉 2011-09-20
  • 打赏
  • 举报
回复
内存泄露……
辰岡墨竹 2011-09-20
  • 打赏
  • 举报
回复
这就是为什么Google的Chrome浏览器选择每个标签页(Web页面)都在一个单独的进程里,就是因为进程退出时,所有进程用的内存全部会被回收,所以像Javascript引擎这样的就算出错或轻微泄漏也不用担心。
不过对于某些要长时间在一个进程里运行的程序,如果出现内存泄漏可能会导致耗光系统可用内存,所以new必须要养成delete的习惯。
辰岡墨竹 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 qaz225cn 的回复:]

嗯,,微机原理真是不太明白
我从汇编的角谈一谈吧,c/c++ 最后还是会编译成汇编 new()的位置是会放在 堆 中,分配一块地址,然后返回地址首地址,而堆是系统虚拟的内存。
然后调用的时候,堆里的数据是把堆的指针传入SS堆栈段寄存器,push pop 再push 数据处理后又返回虚拟内存,这样如果不释放new()是不会影响cpu,也不影响内存,可能影响虚拟内存。
(后文是百度的)另外操……
[/Quote]
没那么麻烦,只要退出时把进程用的虚拟内存页表全释放掉就可以了。
4楼的xxwy89。
别忘了虚拟内存机制里进程的独立4GB地址空间,和其它进程隔离的,这其中的内存页映射都是OS管理的。进程退出时进程用的页表消失,自然不会占用任何内存空间。
shiyunqiang 2011-09-20
  • 打赏
  • 举报
回复
程序退出,系统会自动回收。
qaz225cn 2011-09-20
  • 打赏
  • 举报
回复
上面进入堆栈段寄存器的时候,对寄存器操作代码写错了,该是pop保存原来段寄存器中的数据 然后push 载入 计算了处理后 然后pop 保存处理后的数据,
qaz225cn 2011-09-20
  • 打赏
  • 举报
回复
嗯,,微机原理真是不太明白
我从汇编的角谈一谈吧,c/c++ 最后还是会编译成汇编 new()的位置是会放在 堆 中,分配一块地址,然后返回地址首地址,而堆是系统虚拟的内存。
然后调用的时候,堆里的数据是把堆的指针传入SS堆栈段寄存器,push pop 再push 数据处理后又返回虚拟内存,这样如果不释放new()是不会影响cpu,也不影响内存,可能影响虚拟内存。
(后文是百度的)另外操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,所以不释放,程序结束后系统收回是可以的
Jonix 2011-09-20
  • 打赏
  • 举报
回复
两个不同的立场产生了。

现在的32位OS,内存是建立在虚拟内存,而不是物理内存上的。
所以1楼的说法是正确的。

但是以前的DOS系统,内存是直接在物理级的,就会出现很严重的问题了。

Michael_g 2011-09-20
  • 打赏
  • 举报
回复
你的程序崩溃不是因为没释放,很可能是引用了错识的指针,或操作已释放的内存。单纯不释放new 的内存是不引起崩溃的(除了内存不足)。
Michael_g 2011-09-20
  • 打赏
  • 举报
回复
现在的32位cpu下,程序(进程)退出后其所有申请的内存都会被释放,这是保护模式的特点,所有的进程都拥有整个地址空间,但它们又不直正拥有物理内存,这是通过虚似内存及分页来实现的。
PG 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pathuang68 的回复:]

程序退出时,该程序中所new的内存会由系统释放。
[/Quote]
++
科比布莱恩特 2011-09-20
  • 打赏
  • 举报
回复
程序退出时倒底会释放我所有new过的内存么?

程序中因为这个东西使程序崩溃过,怎么解释?
simimasaiya 2011-09-16
  • 打赏
  • 举报
回复
对于这一点我也同样有些疑问,不过我觉得当整个程序结束的时候,在执行过程中分配的内存——无论在执行末尾有没有得到释放——肯定是强制释放了,因为程序的执行单位即进程,有个进程控制块PCB,PCB分配了内存来供进程在运行过程中使用,当程序结束的时候,PCB也压根没有了,更别说PCB所占的内存了。
个人粗浅理解,错误之处请他人指正。
AndyZhang 2011-09-16
  • 打赏
  • 举报
回复
会,除非你重启
pathuang68 2011-09-16
  • 打赏
  • 举报
回复
程序退出时,该程序中所new的内存会由系统释放。
加载更多回复(10)

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧