线程中的睡眠会导致内存泄漏
A sleep in thread causes memory leak
我窥探了我祖先的代码,发现了以下情况下的泄漏:
1) 启动应用程序
b) 应用程序启动后,在4秒内关闭应用程序
泄漏信息:
f:ddvctoolsvc7libsshipatlmfcsrcmfcthrdcore.cpp(306) : {58509} client block at 0x016DFA30, subtype c0, 68 bytes long.
随后,我翻阅了代码,在工人线程的控制功能上,在4秒的睡眠时间里找到了可疑的原因。
测试程序:
UINT InitThread(LPVOID pParam)
{
Sleep(4000); //4000 is the default value, it reads from a registry key.
CMyMFCTestProjectDlg* pTest = (CMyMFCTestProjectDlg*)pParam;
pTest->DoSomething();
return 0; //--> Exit thread
}
BOOL CMyMFCTestProjectDlg::OnInitDialog() {
...
AfxBeginThread(InitThread, this);
...
}
如果我减少/删除睡眠计时器,泄漏就会得到解决
然而,我想知道它是如何发生的。是由于工作线程还是GUI线程终止?GUI线程导致此问题后,工作线程是否会退出?
有谁能帮我解释一下这件事,让我高兴起来吗?我迷路了。。。。
在应用程序关闭后,工作线程似乎没有机会正确关闭自己,因为进程在退出之前就结束了。操作系统通常非常擅长自己清理资源,所以这可能不是问题。但是,最好等待线程退出,然后再关闭应用程序。尽管这听起来会导致应用程序关闭延迟4秒。
如果这是不可接受的,您将不得不向线程添加一些机制,以从应用程序主线程接收关闭事件。例如,如果将工作线程"sleep"替换为事件的WaitForSingleObject:
DWORD res = WaitForSingleObject(
shutdownEvent,
4000); // timeout
if(res == WAIT_OBJECT_0)
{
// received the shutdownEvent, exit
return 0;
}
// The delay has elapsed, continue with rest of thread.
. . .
然后,当你在主线程中关闭时,设置事件,然后等待线程退出,它应该几乎立即退出:
SetEvent(this->shutdownEvent);
WaitForSingleObject(pThread->m_hThread, INFINITE); // pThread is returned from AfxBeginThread
您应该在进程离开之前优雅地关闭线程。您可以让主线程等待其他线程退出,或者让主线程向其他线程发出退出信号。
68字节?
如果应用程序确实关闭了,即已经从任务管理器"应用程序"answers"进程"中消失,和这种"泄漏"的唯一影响是在早期关闭时发出调试消息,只需关闭调试并忘记它。
这很可能是MFC关闭的一种操作,一些结构在关闭期间无法安全释放,而是留给操作系统清理。
99.9%的应用程序没有持续重新启动/停止,即使没有清理,关闭时的68字节泄漏也不会在每个"补丁星期二"强制执行的重新启动间隔之间以任何明显的方式影响Windows机器的运行。
我相信你还有很多影响更严重的bug需要处理。如果没有,你可以吃一些我的!
Rgds,Martin
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏