2016-04-29 147 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結構時,內存將被清除。