Почему `make_unique` использует` new`, а make_shared использует `:: new` - PullRequest
3 голосов
/ 23 мая 2019

Я работаю над проектом, в котором пара операторов перегрузки классов new и delete использует свободные списки, и я попытался использовать make_shared для управления своими выделениями с помощью интеллектуальных указателей, когда я понял, что make_shared не использует перегруженные версии, но делает явный вызов глобальным ::new. Но согласно эта make_unique использует перегруженные версии. Что довольно сложно для меня. Почему make_shared игнорирует перегрузку операторов, а make_unique нет?

1 Ответ

7 голосов
/ 23 мая 2019

make_shared должен выделить две вещи: строящийся объект и блок управления shared_ptr. Чтобы повысить производительность, он выделяет один кусок памяти, достаточно большой для обоих, а затем размещает их в новостях.

make_unique не нужно этого делать, поскольку unique_ptr не нуждается в блоке управления.


Если вы хотите контролировать, как выделяется память для объекта, управляемого shared_ptr, создайте соответствующий класс распределителя и используйте allocate_shared вместо make_shared.

...