Ответ 1
Не указано, что происходит с памятью. Он просто определяет следующие требования:
В контейнерах с последовательностями для clear()
имеются следующие требования:
[C++11 §23.2.3]
Таблица 100
Уничтожает все элементы в
a
. Недействительность всех ссылок, указателей, итераторы, ссылающиеся на элементыa
и могут аннулировать прошлый итератор.post:
a.empty()
возвращаетtrue
Что на самом деле ничего не говорит о памяти. Для ассоциированных контейнеров мы имеем это требование для clear()
:
[C++11 §23.2.4]
Таблица 102
a.erase(a.begin(),a.end())
Что приводит к требованиям erase(...)
, которые:
стирает элемент, на который указывает
q
. Возвращает итератор, указывающий на элемент, следующий заq
до стирания элемента. Если такой элемент не существует, возвращаетa.end()
Что опять же не упоминает о емкости буфера памяти контейнера. Тогда у нас есть неупорядоченные ассоциированные контейнеры, которые имеют схожие формулировки:
[C++11 §23.2.5]
Таблица 103
Стирает все элементы в контейнере. Сообщение:
a.empty()
возвращаетtrue
В целом, стандарт не упоминает, что что-то происходит с буферами внутренней памяти после clear
. Таким образом, неопределенное поведение, которое может варьироваться между различными реализациями.
Так как reserve
недоступен во всех контейнерах (что меняет емкость), и ни одна из них не является следующей лучшей (shrink_to_fit
), похоже, нет хорошего способа последовательно очищать внутреннюю память контейнер.