std::vector 不在线程中释放内存
std::vector does not release memory in a thread
如果我使用 _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);
}
我以为std::vector<WCHAR>
在超出范围时释放了内存?
C++ 不知道调用 _endthreadex
会使线程消失。所以它不会在调用 _endthreadex
.
之前调用 asdf
等局部变量的析构函数
解决方案:不要那样做。 return 0;
结束线程并调用析构函数。
如您在 documentation for _endthreadex
中所见,_endthreadex
导致未调用线程中挂起的 C++ 析构函数。
所以只需删除对 _endthreadex
的调用,您应该没问题。
这种行为的原因在 中有解释。
如果我使用 _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);
}
我以为std::vector<WCHAR>
在超出范围时释放了内存?
C++ 不知道调用 _endthreadex
会使线程消失。所以它不会在调用 _endthreadex
.
asdf
等局部变量的析构函数
解决方案:不要那样做。 return 0;
结束线程并调用析构函数。
如您在 documentation for _endthreadex
中所见,_endthreadex
导致未调用线程中挂起的 C++ 析构函数。
所以只需删除对 _endthreadex
的调用,您应该没问题。
这种行为的原因在