社区
C++ 语言
帖子详情
内存的概念
科比布莱恩特
2011-09-16 09:15:22
在程序中new了一个对象或类型,程序中不释放,退出程序时也不释放,那么当程序退出后,程序所new的那块内存还会在系统中存在么?
...全文
330
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)
内存
|
内存
的
概念
、
内存
的作用、
内存
的物理结构及
内存
使用
内存
是计算机硬件的重要组成部分,作为CPU与数据交互的桥梁。它包括RAM、ROM和Cache三种类型,其中Cache提高数据读取速度。
内存
的物理结构涉及地址线和数据线,通过指针进行数据访问。C语言使用指针操作
内存
,不同数据类型占用不同字节数。
Linux
内存
的
概念
及管理
本文深入解析
内存
的
概念
、种类及管理方式,包括RAM、ROM、Cache的功能与区别,以及malloc与free函数在
内存
分配与回收中的具体执行流程。
C语言的深入——
内存
对齐的
概念
本文详细解析了
内存
对齐的
概念
及其对CPU访问数据效率的影响,并通过具体例子讲解了结构体成员对齐数和整体大小的计算方法。
cache、虚拟
内存
、
内存
的区别以及DMA的
概念
本文详细介绍了
内存
(RAM)、高速缓存(Cache)和虚拟
内存
的作用,强调了它们在速度和容量上的差异。还探讨了直接
内存
访问(DMA)的
概念
,解释了DMA如何在不占用CPU资源的情况下高效传输数据,以及DMA在数据传输中对系统总线资源的影响和
内存
连续性的重要性。
关于
内存
泄漏的
概念
本文详细解释了
内存
泄漏的
概念
,指出它仅存在于堆分配的
内存
中。当程序不断申请
内存
但不释放时,会导致
内存
耗尽。
C++ 语言
65,211
社区成员
250,515
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章