clear () не гарантирует фактического освобождения выделенной памяти в векторе; _Tidy () в реализации MSVC фактически освободит это хранилище, так что это, вероятно, было сделано как оптимизация.
Это зло, но вы можете сделать это легально (без неопределенного поведения), если хранилище повторно используется объектом того же типа (без учета cv-квалификаторов), который занимает ровно все хранилище:
T automatic;
automatic.T::~T();
new (&automatic) T();
Раздел 3.8.7 стандарта C ++ описывает этот сценарий использования и объясняет его законность; он даже включает пример, аналогичный приведенному выше.