Оба примера гораздо более многословен, чем это необходимо:
std::shared_ptr<int> p(new int); // or '=shared_ptr<int>(new int)' if you insist
auto p = std::make_shared<int>(); // or 'std::shared_ptr<int> p' if you insist
В чем разница?
Главное отличие состоит в том, что для первого требуется два распределения памяти: один для управляемого объекта (new int
) и один для подсчета ссылок. make_shared
должен выделить один блок памяти и создать в нем.
Какой я должен предпочесть и почему?
Обычно вы используете make_shared
, так как это более эффективно. Как отмечено в другом ответе, он также избегает любой возможности утечки памяти, поскольку у вас никогда не было необработанного указателя на управляемый объект.
Однако, как отмечается в комментариях, у него есть потенциальный недостаток, заключающийся в том, что память не будет выпущена при уничтожении объекта, если есть все еще слабые указатели, препятствующие удалению общего счета.
Второй должен быть 'std :: make_shared()'. –
nosid
Да, но не в этом случае. Всегда используйте 'make_shared'.Дополнительную информацию см. В следующем URL-адресе: http://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/ – nosid
@Deduplicator: как, черт возьми, мой вопрос является дубликатом одного вопроса спустя год ? –