免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7775 | 回复: 19
打印 上一主题 下一主题

exit与return的区别(内存泄漏方面) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-01 10:18 |只看该作者 |倒序浏览
最近看purify的使用手册,关于内存泄漏有一种说法

int main()
{
    char *p = (char*)malloc(16);
    return 0;
}

上面的代码明显有泄漏。purify中讲把return换成exit就没有泄漏了。
看看exit的使用手册,只说了flush buffer and close opened files没说关于内存方面的
哪位给解释一下

purify中的解释我下午贴出来,现在不在手边。

论坛徽章:
0
2 [报告]
发表于 2005-12-01 10:21 |只看该作者

都不存在

不管是return还是exit都不会free内存
但操作系统都会帮你清理掉.
bennie 该用户已被删除
3 [报告]
发表于 2005-12-01 10:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2005-12-01 10:55 |只看该作者
原帖由 bennie 于 2005-12-1 10:47 发表

不清楚你使用的是C还是C++,如果是C++的话,还是尽量避免使用exit。用exit的时候任何自动变量和临时变量的析构函数都不会被调用。如果是C的话,关系不大。对于这种析构你可以用atexit 来指定一个退出时资源清理 ...

赞!是不是某个高手的马甲?

论坛徽章:
0
5 [报告]
发表于 2005-12-01 11:31 |只看该作者
原帖由 leolein 于 2005-12-1 10:18 发表
最近看purify的使用手册,关于内存泄漏有一种说法

int main()
{
    char *p = (char*)malloc(16);
    return 0;
}

上面的代码明显有泄漏。purify中讲把return换成exit就没有泄漏了。
看看exit的使用 ...


有点令人费解. C程序编译后经过链接生成的最终的可执行程序的逻辑为:
初始代码+ main( )调用 + 结尾处理(主要就是调用exit())  (这里的初始代码是在链接阶段加入的)
.从中我们可以看出,如果main调用exit,就从main中直接结束程序,否则main返回后,程序的最后部分也自动调用exit(),也就是说无论你在程序中是否显式调用exit(),程序在运行中的退出都是由exit()完成的. 所以main中return还是exit都是一样的.

论坛徽章:
0
6 [报告]
发表于 2005-12-01 11:31 |只看该作者
所谓内存泄漏,我的理解是某个程序申请的内存空间没有正确释放,又不断重新申请,最后导致本身down掉.
如果程序结束,所有的内存都会被操作系统回收,应该没有泄漏之说的.

论坛徽章:
0
7 [报告]
发表于 2005-12-01 11:49 |只看该作者
malloc函数所向系统申请的内存是不会随着程序的结束而得到释放的

论坛徽章:
0
8 [报告]
发表于 2005-12-01 12:39 |只看该作者
原帖由 mageguoshi 于 2005-12-1 11:49 发表
malloc函数所向系统申请的内存是不会随着程序的结束而得到释放的


谬论. 除非你用的是你自己设计的不良不规范的操作系统

[ 本帖最后由 hightman 于 2005-12-1 13:03 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2005-12-02 09:08 |只看该作者
purify 如是说:
If main called exit at the end, p would remain in scope at termination,retaining a valid pointer to start of the allocated memory block. Purify would then reported it as memory in use rather than memory leaked.
Alternatively, main cound free p before returning,deallocating the memory so it is no longer in use or leaked.

论坛徽章:
0
10 [报告]
发表于 2005-12-02 09:23 |只看该作者
原帖由 bennie 于 2005-12-1 10:47 发表

不清楚你使用的是C还是C++,


原文中使用的是C。
不过我使用C++也同样的结果,使用exit时purify都没有报内存泄漏

如果是C的话,关系不大。对于这种析构你可以用atexit 来指定一个退出时资源清理 ...


purify中确实用exit替代return来修正内存泄漏。我想IBM不会犯这种错误吧。

不过既然一个程序都at termination了,这些指针怎么还会有效呢?purify认为接下来谁会释放他们?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP