- Правильно ли я считаю, что распределитель отвечает за управление памятью из элементов? (И убедитесь, что он объявлен из стека / freestore / heap / что угодно)
Нет, ты не. Распределитель просто покрывает сахаром над new
и delete
и в целом отвечает за принятие решения , где будет выделена память. Ответственность за звонки allocate
, deallocate
, construct
и destruct
лежит на его пользователях (что означает здесь std::vector
). С вашей точки зрения, это будет автоматически, что в конечном итоге имеет значение.
- Что делает std :: allocator? - Он объявляется из стека или из кучи?
std::allocator
назначается с использованием ::operator new(size_t)
, поэтому оно зависит от определения глобального оператора new
. Как правило, это означает кучу. Стек предназначен для объекта с автоматической продолжительностью хранения.
- (продолжение предыдущего вопроса): если я скопирую элемент, объявленный в стеке, в структуру данных, он все равно будет объявлен в куче?
Если вы копируете элемент, то копия выделяется там, где вы его копируете. Здесь это означает копирование элемента из стека в кучу. Затем у вас есть две копии объекта, что означает, что изменения в одной копии не отражаются в другой.
Остерегайтесь, однако, речь идет о режиме копирования по умолчанию , то есть мелком копировании. Если вы скопируете объект, он будет скопирован полностью; если вы скопируете указатель, будет скопирован только указатель, а не данные, на которые он указывает.