Использование 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 вам необходимо указать тип делетера в качестве второго аргумента шаблона, а затем передать соответствующий объект конструктору.