为什么调用LocalFree()会导致错误?

Nat*_*man 2 c++ winapi

我调用GetNamedSecurityInfo()如下:

PSID pSID = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;

// Retrieve the owner SID for the file
if(GetNamedSecurityInfo(TEXT("myfile.txt"),
                        SE_FILE_OBJECT,
                        OWNER_SECURITY_INFORMATION,
                        &pSID,
                        NULL, NULL, NULL,
                        &pSD) != ERROR_SUCCESS) {
    /* error handling */
}

FreeSid(pSID);
LocalFree(pSD);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行应用程序时,它崩溃了.调试器报告:Critical error detected c0000374并指向LocalFree()上面代码段末尾的行.

为什么这条线会导致问题?根据ppSecurityDescriptor参数的文档:

"指向接收指向对象安全描述符的指针的变量的指针.当您使用完指针后,通过调用LocalFree函数释放返回的缓冲区."

......这正是我所做的.

Who*_*aig 5

pSID本地var 引用的SID 指的是已在所引用的安全描述符中保存的数据pSD.它"拥有"那个SID,你拥有描述符引用.你只需要释放后者.

简短版本:删除FreeSid(pSID)通话.