如果我使用 , 創建一個執行緒_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>當它超出范圍時會釋放記憶體?
uj5u.com熱心網友回復:
C 不知道呼叫_endthreadex會使執行緒消失。所以它不會像asdf呼叫之前那樣呼叫區域變數的解構式_endthreadex。
解決方案:不要那樣做。return 0;結束執行緒并呼叫解構式。
uj5u.com熱心網友回復:
正如您在檔案_endthreadex中看到的那樣,_endthreadex導致執行緒中掛起的 C 解構式不被呼叫。
因此,只需洗掉對的呼叫,就_endthreadex可以了。
此答案中解釋了此行為的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447420.html
上一篇:無法正確停止執行緒池
下一篇:Java中的原子性是什么
