在 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_ptr
和std::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);
}
我正在调用 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_ptr
和std::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);
}