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

时间:2015-07-15 21:09:05

标签: 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);

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

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

  

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

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

1 个答案:

答案 0 :(得分:5)

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

短版:删除FreeSid(pSID)来电。