为什么我的窗户怠速时的控制台应用程序泄露? (为什么不确凿点kernel32.dll中?)

StackOverflow https://stackoverflow.com/questions/2206930

我有出现一个窗口多threded控制台应用程序是漏大约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小时一

任何想法greately理解。

有帮助吗?

解决方案

这堆栈跟踪看起来像它在与计时器代码。我猜你的代码(或你使用一个库)使用timeSetEvent或类似的功能启动一个定时器。在这种情况下,泄漏很可能会在你的计时器回调函数。

启动多媒体计时器会导致创建一个线程,回调将从该线程调用。周期性定时器可以解释为什么它泄漏而空转。

其他提示

您的应用程序有任何的APC(异步过程调用)或计划的计时器事件? 多媒体计时器回调会。

如果您的回调使用C运行时调用,这些调用使得一次性线程局部分配(懒洋洋地,分配第一次调用该函数在一个线程)做他们的工作(_tcstol,sprintf的等)。因为线程未用beginthread()或beginthreadex开始()该存储器不能被清理时在线程死亡,所以这将表现为泄漏。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top