Есть ли подходящее «владение в упаковке» для «ручек»?
рукоятки иметь правильную семантику, кроме указателей. Так что для меня такой пример (извлеченный изПравило нуля):
class module {
public:
explicit module(std::wstring const& name)
: handle { ::LoadLibrary(name.c_str()), &::FreeLibrary } {}
// other module related functions go here
private:
using module_handle = std::unique_ptr<void, decltype(&::FreeLibrary)>;
module_handle handle;
};
с помощьюunique_ptr
как «владение в пакете» для ручек - плохой пример. Во-первых, он использует внутренние знания о том, что дескриптор является типом указателя, и использует это для созданияunique_ptr
на базовый тип, на который опирается «непрозрачный» тип ручки.
Дескрипторы могут быть любого типа, они могут быть указателями, они могут быть индексами или кто знает. Самое главное, что у вас под рукой (например, из большинства C API) - это дескриптор и его функция высвобождения ресурсов.
Существует ли надлежащая «собственность в пакете», котораяработает в семантике дескриптора? Я имею в виду, уже общедоступный для использования?
Для меня,unique_ptr
и др. и др. не работает, я должен сделать ненужные предположения о том, что тип ручкиявляется, когда я хочу просто получить «владение в пакете» только через непрозрачный тип дескриптора и его функцию освобождения.
Не имеет смысла вглядываться в тип дескриптора для создания конструкций на основе этой информации. Это ручка, это не должно иметь значения.
Я процитирую здесь чувства другого пользователя SO вдругой вопрос ответ:
Создайте определенный класс «умный указатель», это не займет много времени. Не злоупотребляйте занятиями в библиотеке. Семантика дескриптора весьма отличается от таковой для указателя C ++; с одной стороны, разыменование РУЧКИ не имеет смысла.
Еще одна причина использовать пользовательский класс умных дескрипторов - NULL не всегда означает пустой дескриптор. Иногда это INVALID_HANDLE_VALUE, что не то же самое.
Отказ от ответственности:
Этот вопрос переформулирует и строит на этом:
Где правильное (управление ресурсами) правило нуля?