Необходимость в функции std::make_shared в C++ появилась для более безопасного и эффективного создания общих указателей. 1
При создании общего указателя на уже существующий объект выделяется три разных участка памяти: одно для блока управления общим указателем, одно для объекта и одно для самого общего указателя. 1 С помощью std::make_shared происходит только два распределения памяти: одно для общего указателя, а другое — как для блока управления, так и для объекта. 1 Это обеспечивает лучшую эффективность, чем обычный общий указатель. 1
Кроме того, конструирование std::sharedptr из свежесозданного сырого указателя может приводить к утечке памяти, если компилятор перемешает вызовы в произвольном порядке. 3 Чтобы избежать этого, была придумана функция std::makeshared. 3