程序退出时还会有内存泄露吗?

halleyzhang3 2013-11-01 12:45:44
这好像是被很多人讨论过的话题了,就是用new分配的内存如果在程序退出时不释放,会不会引起内存泄露?GlobalAlloc应该是会的,这个没有疑问。new 按操作系统的介绍,32位Windows应该是不会了吧?从会写程序的时候起,VC的集成环境就在程序退出时报告内存泄露,我们也习惯于努力定位解决它们,但是现在是不是真的有必要呢,谁来个令人信服的回答?
...全文
2400 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
watercubecn 2014-06-20
  • 打赏
  • 举报
回复
引用 13 楼 ForestDB 的回复:
梵天醒来,世界也就不存在了。
精辟!!!
expectances 2014-03-03
  • 打赏
  • 举报
回复
现在的操作系统做的很完善了,程序退出后回收未释放的内存不是问题。 但是存在两个问题: 并不是所有的系统都“足够完善”,或者有条件或者必要提供那么多功能。 并不是所有的程序都会及时退出。 虽然不能认为那些支持不释放的人的观点不对,但是自家知自家事儿,清楚自己该怎么做就行了。
SKATE11 2013-11-04
  • 打赏
  • 举报
回复
要是程序异常退出的话不会释放
赵4老师 2013-11-04
  • 打赏
  • 举报
回复 1
虎头蛇尾是俗人的习惯, 有始有终是君子的操守。
halleyzhang3 2013-11-04
  • 打赏
  • 举报
回复 1
即使在退出时释放内存是一个好习惯,但关于程序退出时操作系统能不能释放内存的讨论还是有意义的,免去一些可省略的内存释放会极大地简化我们的程序。比如static的buffer,单例(singlton)对象的析构。如果一块内存的生存周期和程序的生存周期一样长,或者一块小的内存分配确信不会成百上千次地被调用,那么我们就可以省略掉内存释放,这在模块之间的接口上通常意味着减少一个destroy的接口。我觉得我们应该考虑一下这可以在哪些地方简化我们习以为常的、严谨的、却使程序变得复杂化的编程习惯
lin5161678 2013-11-04
  • 打赏
  • 举报
回复
内存泄露一直是一个 运行期的概念 程序都结束了 讨论什么 内存泄露???
nice_cxf 2013-11-04
  • 打赏
  • 举报
回复
当然不会了,不然你用任务管理器结束程序,或linux下面有kill -9结束程序,这时基本必然有没delete的数据,如果有内存泄漏的话,操作系统能用多久啊?
majia2011 2013-11-04
  • 打赏
  • 举报
回复
很多程序员都是“纯粹主义”,还是那种只看了半本书的纯粹,呵呵呵
skyworth98 2013-11-02
  • 打赏
  • 举报
回复
引用 2 楼 halleyzhang3 的回复:
[quote=引用 1 楼 max_min_ 的回复:] 程序退出了!差不多所有的资源都会释放的,被系统回收重新利用的!所以不会有内存泄漏这一说! 内存泄漏:在当前进程在堆中分配了空间后,没有及时释放掉(不再需要此空间),并且进程没有结束! 至于你说的关闭程序时提示,可能是析构函数写的有问题吧!
Detected memory leaks! Dumping objects -> {7268} normal block at 0x01B8CFA8, 46 bytes long. Data: < > CC 13 CC 00 0E 00 00 00 0E 00 00 00 01 00 00 00 Object dump complete. 别和我说你没见过这个,除非你只写linux程序。 想再多说几句,多数人认为不会泄露,我也倾向于不会泄露,但是既然不会泄露vc为什么还要弄出这么个提示呢?所以我希望能有一个令人信服的解释,否则我们还是不能放心大胆地听之任之。我猜测可能是16位Windows的历史遗留问题,可是也不能令人信服,因为现在已经没人用16位windows了,可是新版的vc还是一样会这么提示的[/quote] 对不需要长时间运行的程序,比如IE,来说,内存泄漏可能并不是什么大不了的问题,出问题了,关了再重新打开就是了。 但是对需要长时间运行的程序,比如银行系统,内存泄漏就是一种灾难了,哪怕每次泄露几个字节,时间长了也会耗尽系统内存,你说需不需要修复?
binecy 2013-11-02
  • 打赏
  • 举报
回复
chen870201 2013-11-02
  • 打赏
  • 举报
回复
我也觉得应该不会
mujiok2003 2013-11-02
  • 打赏
  • 举报
回复
有借有还,再借不难。
WizardOz 2013-11-02
  • 打赏
  • 举报
回复
引用 2 楼 halleyzhang3 的回复:
[quote=引用 1 楼 max_min_ 的回复:] 程序退出了!差不多所有的资源都会释放的,被系统回收重新利用的!所以不会有内存泄漏这一说! 内存泄漏:在当前进程在堆中分配了空间后,没有及时释放掉(不再需要此空间),并且进程没有结束! 至于你说的关闭程序时提示,可能是析构函数写的有问题吧!
Detected memory leaks! Dumping objects -> {7268} normal block at 0x01B8CFA8, 46 bytes long. Data: < > CC 13 CC 00 0E 00 00 00 0E 00 00 00 01 00 00 00 Object dump complete. 别和我说你没见过这个,除非你只写linux程序。 想再多说几句,多数人认为不会泄露,我也倾向于不会泄露,但是既然不会泄露vc为什么还要弄出这么个提示呢?所以我希望能有一个令人信服的解释,否则我们还是不能放心大胆地听之任之。我猜测可能是16位Windows的历史遗留问题,可是也不能令人信服,因为现在已经没人用16位windows了,可是新版的vc还是一样会这么提示的[/quote] 这个泄露不是你前面说的那种意义上的泄露。一般来说,程序退出,那么他申请的所有内存都被系统释放了。但是内存检查工具还是会针对没有人为释放的代码做泄露提示,这个是出于对代码测试的考虑。内存检查工具根本不知到那些内存是仍然在你的掌控当中,所以它只有对所有未人为释放的的内存做泄露报告。 所以一定要养成一个好习惯,就是是在退出前,也要用代码来释放所有还未释放的内存。这样的话,如果内存检查工具还在报内存泄露,那就基本可以肯定真的是内存泄露了。
lm_whales 2013-11-02
  • 打赏
  • 举报
回复
举个简单的例子,我们知道,程序是需要测试的。 那么,许多人一起写的程序,难道必须要等程序完工,才测试? 显然是不必的。 那么,对于局部性质的代码,你可以写个小程序测试一下。 如果你没有考虑,内存泄漏,准备让系统帮你回收内存。 那么除了内存泄漏,其他一切正常,你是不是也认为你的代码没有问题?????
changecode 2013-11-02
  • 打赏
  • 举报
回复
谈论系统问题吗?如果只是单纯讨论开发,作为程序员必须手动释放,无论是程序退出是否全部回收。
lm_whales 2013-11-02
  • 打赏
  • 举报
回复
引用 30 楼 lunat 的回复:
现实生活不是教科书,社会跟学校也有区别。 如果你确定的知道你在做什么,会造成什么后果,那么就让那些教条都随风去吧。 PS: 绝大部分人只怕有生以来也没有、以后也不会接触到不含有进程内存自动释放的操作系统(只要它支持进程概念),对于操作系统的内存管理来讲,这个是最基本的。除非是不支持进程概念的操作系统,不在讨论范围内(往往这样的系统中,程序退出意味着系统的关闭,自然没有什么内存泄露)。 PS2: 拿写小程序习惯推论写大程序的结果,无异于拿芝麻的标准来衡量西瓜。一、二、三,几我就用几个横写,难道你就推论‘万’我要用一万横写?
习惯养成以后,你就不会再区分,大程序,小程序; 何况,即便是小程序,也不一定只有自己一个人写。 小程序,养成良好习惯,大程序,就不会犯一些简单的错误。 何必为了,一个不良习惯; 去区分,何时可以放纵一点,何时可以严谨一点。
max_min_ 2013-11-01
  • 打赏
  • 举报
回复
程序退出了!差不多所有的资源都会释放的,被系统回收重新利用的!所以不会有内存泄漏这一说! 内存泄漏:在当前进程在堆中分配了空间后,没有及时释放掉(不再需要此空间),并且进程没有结束! 至于你说的关闭程序时提示,可能是析构函数写的有问题吧!
JPF1024 2013-11-01
  • 打赏
  • 举报
回复
引用 6 楼 max_min_ 的回复:
[quote=引用 2 楼 halleyzhang3 的回复:] [quote=引用 1 楼 max_min_ 的回复:] 程序退出了!差不多所有的资源都会释放的,被系统回收重新利用的!所以不会有内存泄漏这一说! 内存泄漏:在当前进程在堆中分配了空间后,没有及时释放掉(不再需要此空间),并且进程没有结束! 至于你说的关闭程序时提示,可能是析构函数写的有问题吧!
Detected memory leaks! Dumping objects -> {7268} normal block at 0x01B8CFA8, 46 bytes long. Data: < > CC 13 CC 00 0E 00 00 00 0E 00 00 00 01 00 00 00 Object dump complete. 别和我说你没见过这个,除非你只写linux程序。 想再多说几句,多数人认为不会泄露,我也倾向于不会泄露,但是既然不会泄露vc为什么还要弄出这么个提示呢?所以我希望能有一个令人信服的解释,否则我们还是不能放心大胆地听之任之。我猜测可能是16位Windows的历史遗留问题,可是也不能令人信服,因为现在已经没人用16位windows了,可是新版的vc还是一样会这么提示的[/quote] vc 和你程序没有半毛钱的关系吧? vc只是一个把你代码生成环境而已! ps: 我很少用vc vs 可以说我不会用!一直用vim+g++[/quote]大牛,学习了。。。
zaixiankaifa 2013-11-01
  • 打赏
  • 举报
回复
不会泄露的,楼主不必担心
liuhongwei110 2013-11-01
  • 打赏
  • 举报
回复
引用 4 楼 ri_aje 的回复:
vc 是 vc,系统是系统。 vc 跟你说有泄漏是提醒你自己收拾自己的烂摊子,别指着别人帮忙。 系统帮你收拾是系统人好,愿意多管闲事,也为系统其他程序创造良好的运行环境。 好的习惯是用 raii 管理各种资源。 一旦养成不良习惯,早晚会出问题,因为系统不能够处理所有的烂摊子。 比如我以前给 houdini 写 gpu 的 renderer,houdini 关闭的时候为了省时间,不调用我的析构函数,他们以为最差的也就是内存泄漏,然后有系统收摊呢,所以实际上没问题,这种假设对一般的 cpu 内存管用,问题是 gpu 上根本没系统,结果就出毛病了,一关闭 houdini 就挂。 总之一句话,做好自己份内的事儿。
顶一个!
加载更多回复(29)

64,648

社区成员

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

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