Каков наилучший способ вернуть указатель с фабрики? Должно ли это быть std::unique_ptr
или же std::shared_ptr
или просто необработанный указатель?
Также мне сказали, что нужно идти за std::unique_ptr
если есть сдерживание и std::shared_ptr
если есть агрегация. Это правильный путь?
Вы должны рассматривать необработанные указатели только в очень особых случаях, таких как передача указателя через границу DLL.
Между shared_ptr
а также unique_ptr
Моё мнение — предпочесть последнее. Это делает интерфейс более гибким для ваших пользователей. Они всегда могут конвертировать возвращенные unique_ptr
к shared_ptr
если они хотят, но что более важно, они также могут позвонить unique_ptr::release
а затем вручную управлять указателем (возможно, это не очень хорошая идея, но она оставляет опцию открытой).
Если вашей фабрике нужно назначить пользовательский удалитель для возвращенного unique_ptr
, разница в поведении между unique_ptr
а также shared_ptr
Вы должны знать, что первый не будет вызывать средство удаления, если управляемый указатель nullptr
, но последняя будет. Итак, если ваш завод может вернуться nullptr
(возможно, как условие отказа), и кто-то преобразует unique_ptr
к shared_ptr
, затем убедитесь, что удалитель может обработать вызов с nullptr
в качестве аргумента.
Вы, конечно, не должны возвращать необработанный указатель. Я думаю, что std :: unique_ptr и std :: shared_ptr одинаково хороши в большинстве случаев. Но, конечно, стандартные классы умных указателей не единственные. Например, есть классы, которые реализуют навязчивый подсчет ссылок, и люди реализуют специальный класс интеллектуальных указателей для их обработки, обычно называемый RefPtr. Есть также COM-интерфейсы, для которых есть CComPtr.