免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: leolein
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2005-12-02 09:51 |只看该作者
我想purify是说, p是main函数的自动变量, return 会使 p out of scope, 从而认定p拥有的内存泄漏. 如果exit(), main成了exit的上一级调用函数, 虽然exit不再返回, 但main里的p依然in scope, 其栈依然有效.

这里purify把exit作为一般的函数调用, 虽然很蠢, 但 technically 也没错.

论坛徽章:
0
12 [报告]
发表于 2005-12-02 10:43 |只看该作者
明白了

论坛徽章:
0
13 [报告]
发表于 2005-12-02 12:23 |只看该作者
原帖由 nhw_cs 于 2005-12-1 11:31 发表


有点令人费解. C程序编译后经过链接生成的最终的可执行程序的逻辑为:
初始代码+ main( )调用 + 结尾处理(主要就是调用exit())  (这里的初始代码是在链接阶段加入的)
.从中我们可以看出,如果main调用exit,就 ...


简单的说,初始代码是在 ctr0.o 那些对象文件中包含的,它们调用了 main 函数;通常会是类似这样的格式:
  1. exit( main () )
复制代码

而在 main 中主动调用 exit 只不过是提前了这个过程罢了。exit 函数会调用 atexit 回调,关闭各种 FILE *,然后调用 _exit。_exit 通常是一个系统调用,会通知操作系统清理进程资源(包括回收 VM、文件句柄和其它资源)等。

论坛徽章:
0
14 [报告]
发表于 2006-08-21 15:58 |只看该作者
嗯,收到,不过C++的内存管理还真是一团浆糊,强烈建议大虾们弄几套内存回收机制的实现来瞧瞧

论坛徽章:
0
15 [报告]
发表于 2006-08-21 16:00 |只看该作者
没有什么泄露。

原帖由 leolein 于 2005-12-1 10:18 发表
最近看purify的使用手册,关于内存泄漏有一种说法

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

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

论坛徽章:
0
16 [报告]
发表于 2006-08-21 19:21 |只看该作者
启动的时候都一个一个启动点,无论你是main还是什么,第一条指令就是开始,main只是C的起点.
结束有两种方式,一种是正常,exit,异常,比如SIGKILL的时候你就不用exit了.

无论是不是main,都要经过这些情况.

论坛徽章:
0
17 [报告]
发表于 2006-08-22 00:42 |只看该作者
学习中

论坛徽章:
0
18 [报告]
发表于 2006-08-22 01:00 |只看该作者
没区别

论坛徽章:
0
19 [报告]
发表于 2006-08-22 08:55 |只看该作者
程序都退出来了, 哪来的内存泄露的说法?
如果真的有, 那就是 操作系统的问题,很大很大的问题。

论坛徽章:
0
20 [报告]
发表于 2006-08-22 09:01 |只看该作者
实际上是没有泄漏的。这只是 purify 的内存泄漏探测算法要求程序这么写才不会报错,就像 lint 要求带返回值的函数调用如果不是右值就得在前面加上 (void)。实际上不这样做程序一样没有问题。

还有程序结束时操作系统的内存回收是可信赖的,除了某痿卵的蚊都死98
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP