std::vector 不会释放线程中的内存

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>它超出范围时释放内存?

use*_*751 7

C++ 不知道调用_endthreadex会导致线程消失。因此它不会像asdf调用之前那样调用局部变量的析构函数_endthreadex

解决方案:不要这样做。return 0;结束线程并调用析构函数。

  • @JeffR“您可以显式调用 _endthread 或 _endthreadex 来终止线程;但是,当线程从作为参数传递给 _beginthread 或 _beginthreadex 的例程返回时,会自动调用 _endthread 或 _endthreadex” (2认同)

Izi*_*nza 5

正如您在 的文档中所看到的_endthreadex_endthreadex导致线程中挂起的 C++ 析构函数不被调用。

所以只要删除对的调用_endthreadex就可以了。

此答案中解释了此行为的原因。

  • “通过调用‘endthread’或‘_endthreadex’终止线程有助于确保正确回收为线程分配的资源。” 是严重误导的,因为它在你的情况下恰恰相反! (2认同)