Как мне подходить к выделению памяти для моего класса.Я видел, как оба метода широко используются.Использование собственного распределителя, как и все контейнеры stl, делает его частью своего типа с параметром типа шаблона.Или перегрузите функции new
и delete
и, возможно, размещение new
и размещение delete
.Я посетил и прочитал много вопросов и ответов на оба эти метода, но я не могу понять, какой из них следует использовать в конкретном случае.Очевидно, что все контейнеры stl были разработаны с учетом специального распределителя.Почему бы вместо этого не перегрузить new
и delete
(и т. Д.), Чтобы удовлетворить ваши требования к памяти?Мне кажется, что перегрузка new
и delete
может выполнить все, что мог делать распределитель, и, фактически, возможно, легче с меньшими трудностями.Это может быть особенно актуально в C ++ 17, который поставляется с множеством возможных перегрузок, которые могут даже указывать требования выравнивания, версии тегов nothrow и т. Д.
Нам говорят, что в C ++ мы обычно должны использовать new
иdelete
для типичного распределения кучи (или чаще умных указателей, но сейчас это не «умное» обсуждение, это низкий уровень).Но что, если мы используем распределитель для выделения нашего объекта вместо .allocate()
, а затем конструируем с .construct()
(хотя я считаю, что последняя функция устарела сейчас).По сути, мы будем делать то же самое, что и new std::string{"Hello"}
.
Единственное, что упоминается в Основных рекомендациях C ++ по этому вопросу, это это (т. Е. Ничего).Я не могу найти многое другое на самом деле.А как насчет безопасности потоков?Я предположил, что (настраиваемое) управление памятью, вероятно, является наиболее важным аспектом продвинутого c ++, поэтому я должен точно понимать, что я делаю.
У меня вопрос, какой из двух методов выбрать для управления памятьюмоего класса, реализация пользовательского распределителя памяти (например, контейнеров stl
) или перегрузка new
, delete
, new[]
, delete[]
, размещение new
... и почему?Некоторые другие хорошие практики и рекомендации о том, где и когда также будут очень полезны.Заранее спасибо.