处理GetSidIdentifierAuthority函数的返回值

时间:2016-04-29 05:54:53

标签: c++ windows winapi

我正在使用GetSidIdentifierAuthority函数进行某些操作,它返回一个指针。在我完成它之后,我想释放这个指针。但是,每当我试图释放它时,它立刻就会崩溃。

PSID_IDENTIFIER_AUTHORITY pSid= NULL;
EXPLICIT_ACCESS *pEa= NULL;
PACL pACL = NULL;
ULONG eaSize = 0;
DWORD dwRes = 0;
//some initialization
dwRes = GetExplicitEntriesFromAcl(pACL, &eaSize, &pEa);
pSid= GetSidIdentifierAuthority(pEa[0].Trustee.ptstrName);
//Here GetLastError returns sucess
LocalFree((HLOCAL)pEa); //This call success
LocalFree((HLOCAL)pACL); //This call success
LocalFree(pSid); //This call crushes

在我看来,由于这是一个指针并且GetSidIdentifierAuthority已经返回,它应该由我释放,但我无法做到。这可能有什么问题?

2 个答案:

答案 0 :(得分:2)

GetSidIdentifierAuthority

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446655(v=vs.85).aspx

GetSidIdentifierAuthority函数返回指向指定安全标识符(SID)中SID_IDENTIFIER_AUTHORITY结构的指针。

pSid只是指向pEa内的内存。由于你释放了pEa,pSid指向的内存不再释放pSid会导致崩溃。

不要在代码中释放pSid,它不是新的内存块。

答案 1 :(得分:1)

  

PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority( In   PSID pSid);

根据MSDN,GetSidIdentifierAuthority函数搜索并返回指向可变长度SID_IDENTIFIER_AUTHORITY结构内的SID结构的指针。它不会分配任何额外的内存,所以你不应该释放它的结果。解除分配SID结构时,将清除内存。