windows核心编程第三章
2016-05-11 09:29
218 查看
3.1.1 内核对象的使用计数
内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建该对象的进程长。
3.2.1 创建内核对象
如果调用一个函数创建内核对象,但是调用失败了,那么返回的句柄值通常是0(N U L L)。不过有少数函数在运行失败时返回的句柄值是-1(I N VA L I D H A N D L E VA L U E)。例如,C r e a t e F i l e,所以在返回值验证是否成功的时候需要注意
3.2.2 关闭内核对象
假如忘记调用C l o s e H a n d l e函数,那么会不会出现内存泄漏呢?答案是可能的,但是也不一定。在进程运行时,进程有可能泄漏资源(如内核对象)。但是,当进程终止运行时,操作系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。对于内核对象来说,系统将执行下列操作:当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0,那么内核便撤消该对象。
内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建该对象的进程长。
3.2.1 创建内核对象
如果调用一个函数创建内核对象,但是调用失败了,那么返回的句柄值通常是0(N U L L)。不过有少数函数在运行失败时返回的句柄值是-1(I N VA L I D H A N D L E VA L U E)。例如,C r e a t e F i l e,所以在返回值验证是否成功的时候需要注意
3.2.2 关闭内核对象
假如忘记调用C l o s e H a n d l e函数,那么会不会出现内存泄漏呢?答案是可能的,但是也不一定。在进程运行时,进程有可能泄漏资源(如内核对象)。但是,当进程终止运行时,操作系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。对于内核对象来说,系统将执行下列操作:当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0,那么内核便撤消该对象。
相关文章推荐
- eclipse下使用java api 进行hbase的常用的操作所需的jar包,以及如何查看java build path下的jar是否使用
- C#开发中怎么提升excel导出速度
- cloudsim仿真算法研究之二
- java socket编程
- Java中的抽象类和接口
- C#实现简单的汽车租赁系统
- InputStream和OutputStream的比较
- java经典编程300例
- Java垃圾回收机制
- C# 委托 delegate
- spring 下载地址
- Flex3与java BlazeDS入门教程及其配置详解
- Matlab 读写入txt文件
- vs2010编译Qt工程,中文显示乱码
- python 函数
- c#中取整,向上取,向下取
- cannot find -lmsvcrt
- PHP扩展开发入门3------>带参数的函数
- 理解php依赖注入和控制反转
- 每天laravel-20160804| Container -7