дескрипторы имеют правильную семантику, отличную от указателей. Для меня такой пример (извлечен из Правило нуля):
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++; во-первых, разыменование HANDLE не имеет смысла.
Еще одна причина для использования собственного класса интеллектуальных дескрипторов — NULL не всегда означает пустой дескриптор. Иногда это INVALID_HANDLE_VALUE, что не одно и то же.
Отказ от ответственности:
Этот вопрос переформулируется и основывается на этом:
unique_ptr
может быть немного неправильным — он обрабатывает ресурсы.HANDLE
также обрабатывает ресурсы. Это идеальное совпадение. - person Konrad Rudolph   schedule 14.02.2013unique_ptr
? - person Etienne de Martel   schedule 14.02.2013T*
. - person Lightness Races in Orbit   schedule 14.02.2013unique_ptr
для дескриптора без указателя, вам нужен специальный модуль удаления, который определяет вложенный типpointer
, и этот типpointer
не может быть просто, скажем,int
, посколькуint
не соответствует требованиям NullablePointer. чтоunique_ptr
хочет. Однако вы можете написать простую оболочку, которая адаптирует что угодно к этим требованиям указателя с нулевым значением. Если хотите, вы также можете добавить унарныйoperator*
, который перенаправляет на*value
, иoperator->
, чтобы вы могли использовать*up
иup->foo()
. - person Xeo   schedule 14.02.2013template
, обертывающимunique_ptr
. - person Yakk - Adam Nevraumont   schedule 14.02.2013unique_ptr
для вещей, не связанных с указателем. Серьезно, написание конструкторов копирования/перемещения для одного объекта вряд ли является обременительным бременем. - person Nicol Bolas   schedule 15.02.2013