[quote=引用 8 楼 千梦一生 的回复:] 看了前几位的回答,我还以为是我知识上的一个盲点,去网上学习了一下。这类似于内存泄漏的问题。 只不过不是内存罢了,但也属于系统资源。你在进程中这么搞,确实就是泄漏了。但是如果退出进程后,操作系统会检查这些,返回你进程曾请求的所有系统资源。 关于这种泄漏,给你打个比喻 比如,你在读大学,你刚到学校,没有宿舍,你给宿管说,请给我一个房间,我要住。宿管说,ok,你去222房间,钥匙给,你自己保管好哦。好的,你每天都需要去房间过夜。此时,房间为你所用,对你而言是有意义的。 后来你谈了个女朋友,偷偷违背校规,出去租个房子住。从此,再也没有回到房间去休息过了。此时,房间对你是没有意义的,因为你不再需要,你甚至为了表决心毅然将钥匙扔掉了(函数返回,栈中地句柄、指针丢失),这回就是事实上地对你完全无意义了。可是,你没有告诉过宿管说你“得病”(借口)需要归还房间搬出去单独住(你本该先向操作系统归还资源)。而你确实又是在读学生。所以宿管坚持为你保留这个房间(由于你只申请资源却不去释放,又不退出进程,系统不敢为你释放掉资源,万一你此时此后仍在用呢)。 一年又一年,你这样的家伙多了。学校的“空房间“也挺多的(泄漏地资源),但由于你还没毕业,也不归还钥匙。所以学校在招生的时候考虑到房间满了,就很遗憾的无法容纳许多学生。 直到你这家伙毕业,学校才会去统一清理掉你过去要求(申请)的一切资源
看了前几位的回答,我还以为是我知识上的一个盲点,去网上学习了一下。这类似于内存泄漏的问题。 只不过不是内存罢了,但也属于系统资源。你在进程中这么搞,确实就是泄漏了。但是如果退出进程后,操作系统会检查这些,返回你进程曾请求的所有系统资源。 关于这种泄漏,给你打个比喻 比如,你在读大学,你刚到学校,没有宿舍,你给宿管说,请给我一个房间,我要住。宿管说,ok,你去222房间,钥匙给,你自己保管好哦。好的,你每天都需要去房间过夜。此时,房间为你所用,对你而言是有意义的。 后来你谈了个女朋友,偷偷违背校规,出去租个房子住。从此,再也没有回到房间去休息过了。此时,房间对你是没有意义的,因为你不再需要,你甚至为了表决心毅然将钥匙扔掉了(函数返回,栈中地句柄、指针丢失),这回就是事实上地对你完全无意义了。可是,你没有告诉过宿管说你“得病”(借口)需要归还房间搬出去单独住(你本该先向操作系统归还资源)。而你确实又是在读学生。所以宿管坚持为你保留这个房间(由于你只申请资源却不去释放,又不退出进程,系统不敢为你释放掉资源,万一你此时此后仍在用呢)。 一年又一年,你这样的家伙多了。学校的“空房间“也挺多的(泄漏地资源),但由于你还没毕业,也不归还钥匙。所以学校在招生的时候考虑到房间满了,就很遗憾的无法容纳许多学生。 直到你这家伙毕业,学校才会去统一清理掉你过去要求(申请)的一切资源
函数结束后,其内部变量占用的空间是被释放了 但是内部变量如果是指针类型,那么它指向的内存并没有被自动释放 最典型例子就是动态指针 你在A函数体内定义一个指针类型变量,malloc空间给它, 在没有调用free之前,这个空间一直存在 你从A函数退出,只要free没有调用, 这个申请的空间依然是存在的
两个概念不要混淆,你的写法不是占内存泄露而是句柄泄露 操作系统的句柄数是有限制的, 如果所有人句柄申请后都不释放,最后会申请不到句柄
文件句柄是操作系统管理的,你只是定义了一个变量自己保存它而已,这个变量处于栈当中,所有的局部变量都是在栈当中的 不会关闭, 并且占据系统的文件句柄管理资源
64,683
社区成员
250,490
社区内容
加载中
试试用AI创作助手写篇文章吧