Пожалуйста, помогите мне понять boost::make_shared

Я самостоятельно изучаю С++ и получил фрагмент кода на С++, который выглядит так:

boost::make_shared<Something<Some_Other_thing> >()

Мне не удалось понять, что делает приведенная выше строка и зачем она может потребоваться.

Каким был бы альтернативный способ добиться того же?

Не могли бы вы помочь мне понять на относительно простом языке?

Любой указатель будет высоко оценен.


person Daniel    schedule 10.09.2020    source источник
comment
Мы действительно не можем сказать, что он делает, не зная, какой тип он создает. Важно понимать, что делают конструктор и деструктор этого типа. В противном случае вы получите ответ, который может оставить вас в замешательстве.   -  person David Schwartz    schedule 10.09.2020
comment
Как насчет этого вы не понимаете? Вы читали документацию по функции? Вы знаете, что такое шаблон функции? Знаете ли вы, как явно указать параметры шаблона для шаблона функции?   -  person NathanOliver    schedule 10.09.2020
comment
Любой указатель -- хех.   -  person Quentin    schedule 10.09.2020


Ответы (1)


Вызывая эту функцию, вы создаете общий указатель на тип Something‹Some_Other_thing›. Общий интеллектуальный указатель используется для управления ресурсами, когда больше нет переменных, содержащих этот указатель, ресурс удаляется. Дополнительная информация здесь и здесь

person Andrea Nisticò    schedule 10.09.2020
comment
Это не дает реального ответа, то есть почему можно использовать make_shared() вместо просто boost::shared_ptr< Something<Some_Other_thing> >( new Something<Some_Other_thing> ). Ответы таковы: (а) это выглядит ужасно и make_shared() позволяет избежать повторения, (б) в принципе никогда не нужно писать new или delete в клиентском коде, и (в) make_shared() можно распределить счетчик использования с объектом, тогда как конструкция -from-new способ формулировки не может. На все это уже были даны ответы, но я не знаю, нашел ли я еще лучший дубликат. Кроме того, сейчас std::shared_ptr. - person underscore_d; 10.09.2020
comment
@underscore_d - Хорошо. Теперь я понимаю, что строка boost::make_shared‹Something‹Some_Other_thing› ›() в основном создает новый общий указатель на какой-то объект класса Something‹Some_Other_thing› ›. Но я до сих пор не понимаю, как называется этот указатель? Почему это не определено четко? Или не требуется явно определять? В этом случае, как я могу позже получить доступ/манипулировать этим указателем? - person Daniel; 11.09.2020
comment
@Daniel В вашем вопросе не было ясно, пропустили ли вы имя переменной или код, поскольку вы также сказали «нравится» и дали поддельные имена типов. Если код сделает это, он просто создаст и уничтожит объект в одной строке, что может иметь какой-то полезный побочный эффект, но кажется странным, поскольку обычно такие эффекты заключаются в функцию, а не временный экземпляр объекта. И даже в случае с объектами выделения стека может быть достаточно, если только он не настолько велик, что это невозможно. И без побочных эффектов его следует оптимизировать. В итоге я думаю: просто спросите автора кода - person underscore_d; 12.09.2020