Jef*_*ffR 1 c++ memory multithreading vector beginthreadex
如果我使用 , 创建一个线程_beginthreadex,并且在我使用的线程中std::vector<WCHAR>消耗 200MB 内存 - 当线程结束时,内存不会被释放。即使之后CloseHandle,内存也不会被释放。
这是一个工作示例:
#include <windows.h>
#include <process.h>
#include <vector>
using namespace std;
unsigned __stdcall Thread_RestartComputer(void* pComputerName)
{
std::vector<WCHAR> asdf(100000000);
_endthreadex(0);
return 0;
}
int main()
{
UINT threadID = 0;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Thread_RestartComputer, 0, CREATE_SUSPENDED, &threadID);
ResumeThread(hThread);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
Run Code Online (Sandbox Code Playgroud)
我认为当std::vector<WCHAR>它超出范围时释放内存?
C++ 不知道调用_endthreadex会导致线程消失。因此它不会像asdf调用之前那样调用局部变量的析构函数_endthreadex。
解决方案:不要这样做。return 0;结束线程并调用析构函数。
正如您在 的文档中所看到的_endthreadex,_endthreadex导致线程中挂起的 C++ 析构函数不被调用。
所以只要删除对的调用_endthreadex就可以了。
此答案中解释了此行为的原因。