关于句柄泄漏及线程核心对象,该如何解决

关于句柄泄漏及线程核心对象
    侯捷翻译的<<win32多线程程序设计>>中有这么一段话。
     HANDLE是指向“线程核心对象”,而不是线程本身。这句话让我有点小疑惑。后续的问题来了。
     如果没调用CloseHandle,即使线程结束,内核对象的引用计数在进程结束前不会变为0,那么内核对象就不会删除。这时,该句柄就算泄漏了吧。那么句柄指向的内核对象同样也算泄漏了吧。
    所以,这里是不是同时泄漏了2个东西?另外,“线程核心对象”里应该有包含线程本身地址之类的吧
------解决方案--------------------
这样理解基本没错

这里是不是同时泄漏了2个东西?
HANDLE 实际上是一个索引ID, 这个算不上泄漏
KTHREAD 才是实际的对象


“线程核心对象”里应该有包含线程本身地址之类的吧, 
是的, 对象有很多东西

// Size 1C0
typedef struct _KTHREAD_XP
{
/*0x000*/     struct _DISPATCHER_HEADER Header;
/*0x010*/     struct _LIST_ENTRY MutantListHead;
/*0x018*/     VOID*        InitialStack;
/*0x01C*/     VOID*        StackLimit;
/*0x020*/     VOID*        Teb;
/*0x024*/     VOID*        TlsArray;
/*0x028*/     VOID*        KernelStack;
/*0x02C*/     UINT8        DebugActive;
/*0x02D*/     UINT8        State;
/*0x02E*/     UINT8        Alerted[2];
/*0x030*/     UINT8        Iopl;
/*0x031*/     UINT8        NpxState;
/*0x032*/     CHAR         Saturation;
/*0x033*/     CHAR         Priority;
/*0x034*/     struct _KAPC_STATE ApcState;
/*0x04C*/     ULONG32      ContextSwitches;
/*0x050*/     UINT8        IdleSwapBlock;
/*0x051*/     UINT8        Spare0[3];
/*0x054*/     LONG32       WaitStatus;
/*0x058*/     UINT8        WaitIrql;
/*0x059*/     CHAR         WaitMode;
/*0x05A*/     UINT8        WaitNext;
/*0x05B*/     UINT8        WaitReason;
/*0x05C*/     struct _KWAIT_BLOCK* WaitBlockList;
union
{
/*0x060*/     struct _LIST_ENTRY WaitListEntry;
/*0x060*/     struct _SINGLE_LIST_ENTRY SwapListEntry;
};
/*0x068*/     ULONG32      WaitTime;
/*0x06C*/     CHAR         BasePriority;
/*0x06D*/     UINT8        DecrementCount;
/*0x06E*/     CHAR         PriorityDecrement;
/*0x06F*/     CHAR         Quantum;
/*0x070*/     struct _KWAIT_BLOCK WaitBlock[4];
/*0x0D0*/     VOID*        LegoData;
/*0x0D4*/     ULONG32      KernelApcDisable;
/*0x0D8*/     ULONG32      UserAffinity;
/*0x0DC*/     UINT8        SystemAffinityActive;
/*0x0DD*/     UINT8        PowerState;
/*0x0DE*/     UINT8        NpxIrql;
/*0x0DF*/     UINT8        InitialNode;
/*0x0E0*/     VOID*        ServiceTable;
/*0x0E4*/     struct _KQUEUE* Queue;
/*0x0E8*/     ULONG32      ApcQueueLock;
/*0x0EC*/     UINT8        _PADDING0_[0x4];
/*0x0F0*/     struct _KTIMER Timer;
/*0x118*/     struct _LIST_ENTRY QueueListEntry;
/*0x120*/     ULONG32      SoftAffinity;
/*0x124*/     ULONG32      Affinity;
/*0x128*/     UINT8        Preempted;
/*0x129*/     UINT8        ProcessReadyQueue;
/*0x12A*/     UINT8        KernelStackResident;
/*0x12B*/     UINT8        NextProcessor;
/*0x12C*/     VOID*        CallbackStack;