Multithreading 为什么我的windows控制台应用程序在空闲时会泄漏?(为什么冒烟的枪指向kernel32.dll??)

Multithreading 为什么我的windows控制台应用程序在空闲时会泄漏?(为什么冒烟的枪指向kernel32.dll??),multithreading,winapi,memory-leaks,kernel32,Multithreading,Winapi,Memory Leaks,Kernel32,我有一个windows多线程控制台应用程序,大约每分钟都会泄漏4kb的私有内存 为了定位泄漏,我逐渐暂停了应用程序中的每个线程,直到泄漏停止,令我惊讶的是,罪魁祸首似乎是一个名为“Win32Thread”的线程 它看起来不像是我明确启动的线程 如果连接并断开应用程序,堆栈跟踪如下所示: ntdll.dll!_KiFastSystemCallRet@0() ntdll.dll!_NtCancelTimer@8() + 0xc bytes ntdll.dll!_R

我有一个windows多线程控制台应用程序,大约每分钟都会泄漏4kb的私有内存

为了定位泄漏,我逐渐暂停了应用程序中的每个线程,直到泄漏停止,令我惊讶的是,罪魁祸首似乎是一个名为“Win32Thread”的线程

它看起来不像是我明确启动的线程

如果连接并断开应用程序,堆栈跟踪如下所示:

    ntdll.dll!_KiFastSystemCallRet@0()  
    ntdll.dll!_NtCancelTimer@8()  + 0xc bytes   
    ntdll.dll!_RtlpResetTimer@12()  + 0x15 bytes    
>   ntdll.dll!_RtlpServiceTimer@12()  + 0xfd bytes  
    ntdll.dll!_KiUserApcDispatcher@16()  + 0x25 bytes   
    kernel32.dll!_BaseThreadStart@8()  + 0x34 bytes 
有人知道为什么会突然泄漏吗

该应用程序在Win2k3 SP2双核系统上运行了大约40小时


非常感谢任何想法。

堆栈跟踪看起来像是在与计时器相关的代码中。我猜您的代码(或您使用的库)是通过使用
timeSetEvent
或类似函数启动计时器的。在这种情况下,泄漏可能在计时器回调函数中


启动多媒体计时器会创建一个线程,您的回调将从该线程调用。定期计时器可以解释为什么它在空闲时会泄漏。

您的应用程序是否有任何APCs(异步过程调用)或计划的计时器事件? 多媒体计时器回调可能会失败

如果您的回调使用C运行时调用,这些调用会进行一次性线程本地分配(在线程中首次调用函数时延迟分配)以完成其工作(_tcstol、sprintf等)。由于线程不是用beginthread()或beginthreadex()启动的,因此当线程死亡时,无法清理此内存,因此这将显示为泄漏