Использование unique_ptr и shared_ptr с параметрами функции в C ++ - PullRequest
0 голосов
/ 29 мая 2018

Я вызываю функции Windows, такие как GetExplicitEntriesFromAcl, которые динамически распределяют память (массивы) от моего имени, чья память должна быть освобождена с помощью вызова LocalFree.

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

Могу ли я объявить pItem экземпляромstd :: shared_ptr и до сих пор GetExplicitEntriesFromAcl выделяет его для меня?

Как?

1 Ответ

0 голосов
/ 29 мая 2018

Вам необходимо создать пользовательское средство удаления , чтобы std::unique_ptr и std::shared_ptr знали особый способ удаления памяти.Примерно так:

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

Затем вы можете предоставить функции производителя для вызова функции выделения и использования вашего специального средства удаления:

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);
}
...