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
相关产品推荐
相关产品推荐

