Использование std:: make_unique с пользовательским удалением
При использовании std::unique_ptr
с пользовательским делетером я хочу использовать std::make_unique
, а не новое. Я использую VС++ 2013. Мне кажется, что нельзя использовать std::unique_ptr
, если вы используете пользовательский делектор. Я что-то пропустил или это действительно так?
Дополнительная информация:
Я использую std::unique_ptr<HANDLE, custom_deleter>
для хранения Windows HANDLE для открытого COM-порта.
Я мог бы написать для этого специальный класс RAII, и это было бы непросто, но я видел, как трудно/сложно/плохо использовать std::unique_ptr
.
Ответы
Ответ 1
Вся суть make_unique
заключается в инкапсуляции понятия "use new
для создания T
из заданных аргументов конструктора и использования delete
для его уничтожения".
Если вам нужен пользовательский отладчик, вам также нужно будет указать, как создать объект, и тогда от использования функции создателя размещения ничего не получится.
Я написал несколько примеров пользовательских функций для некоторых уникальных ручек ресурсов в этом сообщении.
Ответ 2
Насколько я знаю, в стандарте С++ 11 нет функции make_unique
. См
Поэтому я бы предположил, что make_unique
представляет собой реализацию от Microsoft, которая по крайней мере не включена в стандарт.
Но, тем не менее, вы можете использовать пользовательский дебетер с unique_ptr
. При использовании unique_ptr
вам необходимо указать тип делетера в качестве второго аргумента шаблона, а затем передать соответствующий объект конструктору.