为什么我的窗户怠速时的控制台应用程序泄露? (为什么不确凿点kernel32.dll中?)
-
18-09-2019 - |
题
我有出现一个窗口多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开始()该存储器不能被清理时在线程死亡,所以这将表现为泄漏。
不隶属于 StackOverflow