gpt4 book ai didi

c++ - 为什么此代码在 Windows 7 Beta 上丢失句柄?

转载 作者:可可西里 更新时间:2023-11-01 14:14:16 25 4
gpt4 key购买 nike

我正在寻找旧 C++ 应用程序中的一些随机崩溃。使用 sysinternals Process Explorer,我注意到应用程序丢失了句柄,并提取了确切的情况,即程序丢失了一段非常短的代码的句柄。

DWORD WINAPI MyTestThread( void*  PThread)
{
_endthreadex(0);
return 0;
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR PParameter, int)
{
for (int i=0;i<10000;i++)
{
unsigned int threadID;
HANDLE hThread= (HANDLE)_beginthreadex( (void*)NULL, (unsigned int)32768, (unsigned int (__stdcall *)(void *))MyTestThread, (void*)NULL, (unsigned int)0, &threadID);
WaitForSingleObject((HANDLE)hThread, 1000);
CloseHandle((HANDLE)hThread);
}
return 0;
}

我的问题:我无法弄清楚这段代码有什么问题。它在每次迭代中正好失去 5 个句柄,但对我来说看起来还不错。
有趣的是:在 windows vista 上似乎不会丢失句柄,但如果这应该是 windows 7 中的错误,我会感到非常惊讶。

[更新] 我尝试使用 _beginthread/_endthread 和 CreateThread/ExitThread,这两个也失去了 5 个句柄,就像 _beginthreadex。

[第二次更新] 代码确实按预期运行。所有返回值都很好。就像没有明天一样,它“只是”失去了 Handlebars 。

[第三次更新] 重大新信息 如果使用/clr 编译,代码只会丢失句柄!而且,如果我在每次迭代中调用 GC::Collect(),句柄将被回收!
那么,我如何找到那里收集了哪些 clr 对象?

最佳答案

检查链接到您的 exe 的某些 DLL 是否在其 DLLMain 中做一些奇怪的事情以响应 DLL_THREAD_ATTACH 通知。

关于c++ - 为什么此代码在 Windows 7 Beta 上丢失句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/552822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com