2016-04-29 18 views
0

何らかの操作でGetSidIdentifierAuthority関数を使用していて、ポインタを返します。私はそれをやった後、私はこのポインタを解放したいと思います。しかし、私はそれを解放しようとするたびに、それはすぐに粉砕する。私の意見で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

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

PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(で PSIDとPSID)。

MSDNによれば、GetSidIdentifierAuthority関数検索とは、可変長SID構造内部SID_IDENTIFIER_AUTHORITY構造体へのポインタを返します。追加メモリを割り当てないので、結果を解放しないでください。メモリは、SID構造の割り当てを解除するとクリアされます。