std :: unique_ptr методы инициализации - PullRequest
0 голосов
/ 09 мая 2020

Я вижу, что std::unique_ptr имеет следующие способы инициализации:

std::unique_ptr<some_class> sc_ptr{ new some_class };

где кто-то может delete выделенный some_class из-под std::unique_ptr.

и

some_class *scptr { new some_class }
std::unique_ptr<some_class> sc_ptr1{ scptr };
std::unique_ptr<some_class> sc_ptr2{ scptr };

Преодоление цели ' unique ' в std::unique_ptr, а также приводит к UDB.

Теперь у меня возникает вопрос: почему Класс std::unique_ptr даже разрешает указанные выше методы инициализации, пока в его распоряжении есть метод std::make_unique<some_class>()?

Я что-то здесь упускаю?

1 Ответ

1 голос
/ 09 мая 2020

Несколько причин:

  1. make_unique требует настраиваемого удаления, поэтому предполагается, что он будет обрабатывать настраиваемое выделение. Передача распределителя в гипотетический allocate_unique обременительна.
  2. То же, что и .release(), может обеспечить соединение с кодом, который по-другому управляет временем жизни (включая API в интерфейсе C, который использует необработанные указатели).
  3. Исторические причины, make_unique был введен только в C ++ 14.

Обратите внимание, что начиная с C ++ 17 основная причина предпочесть make_unique новому была удалена, поэтому вы можете увидеть make_unique только как синтаксический сахар, а не как утилиту безопасности исключений. См. Зачем использовать std :: make_unique в C ++ 17?

...