Для общего программирования да, вы должны использовать new
и delete
.
Однако, если вы пишете библиотеку, этого не следует делать! У меня нет вашего учебника, но я полагаю, что в нем обсуждаются распределители в контексте написания библиотечного кода.
Пользователи библиотеки могут захотеть контролировать, что именно и откуда распределяется. Если бы все распределения библиотеки прошли через new
и delete
, у пользователя не было бы возможности получить этот мелкозернистый уровень управления.
Все контейнеры STL принимают необязательный аргумент шаблона распределителя. Затем контейнер будет использовать этот распределитель для своей внутренней памяти. По умолчанию, если вы опустите распределитель, он будет использовать std::allocator
, который использует new
и delete
(в частности, ::operator new(size_t)
и ::operator delete(void*)
).
Таким образом, пользователь этого контейнера может при желании контролировать, откуда выделяется память.
Пример реализации настраиваемого распределителя для использования с STL и объяснение: Повышение производительности с помощью настраиваемых распределителей пула для STL
Дополнительное примечание: Подход STL к распределителям неоптимален по нескольким причинам. Я рекомендую прочитать На пути к лучшей модели распределителя для обсуждения некоторых из этих вопросов.
Изменить в 2019 году: Ситуация в C ++ улучшилась с момента написания этого ответа. Распределители с отслеживанием состояния поддерживаются в C ++ 11, и эта поддержка была улучшена в C ++ 17. Некоторые из людей, участвовавших в «На пути к лучшей модели распределения», были вовлечены в эти изменения (например: N2387), так что приятно (:
person
jwd
schedule
11.04.2011