В С++ 11 можно использовать shared_ptr
для управления ресурсами, отличными от указателей?
Можно использовать unique_ptr
для управления ресурсами, отличными от указателей. Это делается путем реализации пользовательского класса делетера, который обеспечивает:
- A
typedef {TYPE} pointer;
где{TYPE}
- тип ресурса не указателя -
operator()(pointer)
, который освобождает контролируемый ресурс
..., а затем создавая экземпляр a unique_ptr
с пользовательским делетером в качестве второго параметра шаблона.
Например, под Windows можно создать unique_ptr
, который управляет дескриптором управления . Этот тип дескриптора не освобождается, вызывая delete
, но вызывая CloseServiceHandle()
. Вот пример кода, который делает это:
Custom Deleter
struct SvcHandleDeleter
{
typedef SC_HANDLE pointer;
SvcHandleDeleter() {};
template<class Other> SvcHandleDeleter(const Other&) {};
void operator()(pointer h) const
{
CloseServiceHandle(h);
}
};
typedef std::unique_ptr<SC_HANDLE,SvcHandleDeleter> unique_sch;
Инстанцирование
unique_sch scm(::OpenSCManagerA(0, 0, SC_MANAGER_ALL_ACCESS));
Можно ли использовать shared_ptr
для управления ресурсом не указателя?
В соответствии с документацией существуют shared_ptr
перегрузки конструктора, которые принимают, предоставляют средства для предоставления пользовательского класса делетера, но ни один из конструкторы принимают тип ресурса, который не является указателем или оболочкой вокруг указателя.
Как это можно сделать?