You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中创建线程后是否需释放SECURITY_ATTRIBUTES的lpSecurityDescriptor内存?

关于线程创建后释放SECURITY_DESCRIPTOR内存的问题

你的代码如下:

SECURITY_ATTRIBUTES saNullDACL;
saNullDACL.nLength = sizeof (SECURITY_ATTRIBUTES);
saNullDACL.bInheritHandle = TRUE;
saNullDACL.lpSecurityDescriptor = new SECURITY_DESCRIPTOR;
::InitializeSecurityDescriptor (saNullDACL.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
::SetSecurityDescriptorControl (saNullDACL.lpSecurityDescriptor  ,SE_DACL_PROTECTED,SE_DACL_PROTECTED);  
::SetSecurityDescriptorDacl (saNullDACL.lpSecurityDescriptor, TRUE, NULL, FALSE);

myThread = CreateThread(&saNullDACL, 0, myFunction, myStopEvent, 0, &myThreadID );

是的,你必须手动释放saNullDACL.lpSecurityDescriptor指向的内存,原因如下:

  • 这块内存是你通过new SECURITY_DESCRIPTOR手动在堆上分配的,Windows的CreateThread函数只会在创建线程时读取安全描述符的内容,不会接管内存所有权,也不会帮你释放。
  • 不释放会导致内存泄漏,长期运行的程序中这类泄漏会持续消耗系统资源,影响稳定性。

正确的释放时机是在CreateThread调用完成后(无论调用成功还是失败),执行:

delete saNullDACL.lpSecurityDescriptor;

另外推荐一种更安全的写法——直接在栈上分配SECURITY_DESCRIPTOR,省去手动管理内存的麻烦:

SECURITY_ATTRIBUTES saNullDACL;
SECURITY_DESCRIPTOR sd; // 栈上分配,自动回收

saNullDACL.nLength = sizeof(SECURITY_ATTRIBUTES);
saNullDACL.bInheritHandle = TRUE;
saNullDACL.lpSecurityDescriptor = &sd;

::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
::SetSecurityDescriptorControl(&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED);  
::SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE);

myThread = CreateThread(&saNullDACL, 0, myFunction, myStopEvent, 0, &myThreadID );

内容的提问来源于stack exchange,提问作者Lev Kostychenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:47:40