社区
C++ 语言
帖子详情
内存的概念
科比布莱恩特
2011-09-16 09:15:22
在程序中new了一个对象或类型,程序中不释放,退出程序时也不释放,那么当程序退出后,程序所new的那块内存还会在系统中存在么?
...全文
267
30
打赏
收藏
内存的概念
在程序中new了一个对象或类型,程序中不释放,退出程序时也不释放,那么当程序退出后,程序所new的那块内存还会在系统中存在么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
彻底理解
内存
概念
- -
尽管
内存
这个词常常挂在我们的嘴上,但是,有多少人真正了解
内存
、理解
内存
概念
呢? 对刚刚步入电脑世界的初学者来说,基本
内存
、上位
内存
、高端
内存
、扩展
内存
、扩充
内存
、保留
内存
等
概念
更是玄之又玄,难以彻底...
彻底理解
内存
概念
(zz)
尽管
内存
这个词常常挂在我们的嘴上,但是,有多少人真正了解
内存
、理解
内存
概念
呢? 对刚刚步入电脑世界的初学者来说,基本
内存
、上位
内存
、高端
内存
、扩展
内存
、扩充
内存
、保留
内存
等
概念
更是玄之又玄,难以彻底...
Windows 任务管理器中的几个
内存
概念
Windows 任务管理器中的几个
内存
概念
内存
|
内存
的
概念
、
内存
的作用、
内存
的物理结构及
内存
使用
内存
是硬件,是用于存放数据的硬件。程序执行前需要先放到
内存
中才能被CPU处理。
内存
是与CPU沟通的桥梁,计算机中所有...本文简单介绍了
内存
的
概念
、作用、物理结构以及使用,
内存
远不止如此,后续文章会逐步深入讲解。
虚拟
内存
和物理
内存
的直观理解(
概念
、区别与联系)
操作系统中有虚拟
内存
与物理
内存
的
概念
。 首先理解一下什么叫物理
内存
?什么叫虚拟
内存
? 物理
内存
是指由于安装
内存
条而获得的临时储存空间。主要作用是在计算机运行时为操作系统和各种程序提供临时储存。常见的...
C++ 语言
64,636
社区成员
250,540
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章