日期:2014-05-17  浏览次数:20894 次

Windows内核对象的问题
Windows核心编程 第三章 内核对象 
1:3.2.2节 关闭内核对象
    “BOOL CloseHandle(HANDLE hobj);该函数首先检查进程的句柄表,以确保传递给它的索引(句柄)用于标识一个 进程实际上无法访问的对象”这句话到底要描述什么意思?

2:3.2.2节 关闭内核对象
    “忘记调用CloseHandle函数,会不会发生内存泄漏。。。。”
    第一,按照该段中的描述,在进程终止时,操作系统能够确保该进程使用的任何资源均被释放。那么不调用CloseHandle就应该是肯定不会发生内存泄漏。怎么是可能发生内存泄漏呢?还有就是如果不调用CloseHandle在进程终止时那么内核对象的使用计数该如何处理,是自动减1还是其他?
    还是举个例子吧!比如A、B、C三个进程可以同时访问A所创建的内核对象hobj,此时使用计数为3,
   *t1时刻A进程结束,调用了CloseHandle,那么hobj的使用计数减为2!=0,hobj内存空间依然存在;
    **t2时刻B进程结束,没有调用CloseHandle,那么hobj的使用计数不减1,还是2!=0,hobj内存空间依然存在;
    ***最后C进程结束,调用了CloseHandle,那么hobj的使用计数减为1!=0,那么此时C进程到底将hobj的内存空间是否清空呢?

    第二,还有就是内核对象的内存空间到底在哪里?是存放在创建它的进程的地址空间吗?还是别的地方。

    第三,当我们通常在程序中采用new申请一段堆空间的时候,如果我们不用delete手动释放,那么在进程终止运行时,就会造成内存泄漏。那么按照书中的描述,进程终止的时候操作系统会释放所有资源,那么我们不调用delete怎么还会造成内存泄漏呢?

希望对Winows核心编程有深入理解的朋友,帮忙分析下,谢谢了!
------解决方案--------------------
现在的人都比较浮躁了,能够静下心来好好研究的人实在不多,还得靠自己去认真领悟。
------解决方案--------------------
Windows核心编程 第三章 内核对象 
1:3.2.2节 关闭内核对象
    “BOOL CloseHandle(HANDLE hobj);该函数首先检查进程的句柄表,以确保传递给它的索引(句柄)用于标识一个 进程实际上无法访问的对象”这句话到底要描述什么意思?
中文看不明白,可能需要看看英文办这句话到底是什么

2:3.2.2节 关闭内核对象
    “忘记调用CloseHandle函数,会不会发生内存泄漏。。。。”
    第一,按照该段中的描述,在进程终止时,操作系统能够确保该进程使用的任何资源均被释放。那么不调用CloseHandle就应该是肯定不会发生内存泄漏。怎么是可能发生内存泄漏呢?还有就是如果不调用CloseHandle在进程终止时那么内核对象的使用计数该如何处理,是自动减1还是其他?
    还是举个例子吧!比如A、B、C三个进程可以同时访问A所创建的内核对象hobj,此时使用计数为3,
   *t1时刻A进程结束,调用了CloseHandle,那么hobj的使用计数减为2!=0,hobj内存空间依然存在;
    **t2时刻B进程结束,没有调用CloseHandle,那么hobj的使用计数不减1,还是2!=0,hobj内存空间依然存在;
    ***最后C进程结束,调用了CloseHandle,那么hobj的使用计数减为1!=0,那么此时C进程到底将hobj的内存空间是否清空呢?
进程结束时,操作系统将进程内核对象句柄表中的所有句柄调用CloseHandle()。所以,内核对象是不会导致操作系统资源泄露的

    第二,还有就是内核对象的内存空间到底在哪里?是存放在创建它的进程的地址空间吗?还是别的地方。
内核对象是操作系统资源,不在进程的地址空间。地址有用户地址空间和内核地址空间之分的

    第三,当我们通常在程序中采用new申请一段堆空间的时候,如果我们不用delete手动释放,那么在进程终止运行时,就会造成内存泄漏。那么按照书中的描述,进程终止的时候操作系统会释放所有资源,那么我们不调用delete怎么还会造成内存泄漏呢?
进程中止时,os确实会释放该进程所申请的所有内存。但是这不是我们可以不调用delete的理由,进程长时间运行的话,泄露可能会非常巨大的

希望对Winows核心编程有深入理解的朋友,帮忙分析下,谢谢了!