在 C++ 中将 unique_ptr 和 shared_ptr 与函数参数一起使用

Using unique_ptr and shared_ptr with function parameters in C++

我正在调用 Windows 函数,例如 GetExplicitEntriesFromAcl,它们代表我动态分配内存(数组),必须通过调用 LocalFree 释放内存。

ULONG EntryCount;
EXPLICIT_ACCESS* pItem = nullptr;
ULONG EntryCount;
status = GetExplicitEntriesFromAcl(pACL, &EntryCount, &pItem);
...
...
LocalFree(pItem);

我可以将 pItem 声明为 std::shared_ptr 的一个实例并且仍然让 GetExplicitEntriesFromAcl 为我分配它吗?

怎么办?

您必须创建一个自定义删除器,以便std::unique_ptrstd::shared_ptr知道删除内存的特殊方法。像这样:

struct explicit_access_deleter
{
    void operator()(EXPLICIT_ACCESS* pItem) const
    {
        if(pItem)
            LocalFree(pItem);
    }
};

然后你可以提供maker函数来调用分配函数并使用你的特殊删除器:

std::unique_ptr<EXPLICIT_ACCESS, explicit_access_deleter>
    make_explicit_access_unique_ptr(ULONG EntryCount)
{
    EXPLICIT_ACCESS* pItem = nullptr;
    int status = GetExplicitEntriesFromAcl(pACL, &EntryCount, &pItem);
    // do some error checking here ...
    return std::unique_ptr<EXPLICIT_ACCESS, explicit_access_deleter>(pItem);
}

std::shared_ptr<EXPLICIT_ACCESS>
    make_explicit_access_shared_ptr(ULONG EntryCount)
{
    return make_explicit_access_unique_ptr(EntryCount);
}