Как упоминает 0A0D, эффект swap
заключается в обмене базовой управляемой памятью между двумя векторами. Но это требует немного большего объяснения.
Когда вы clear
a vector
, элементы удаляются из него по крайней мере, насколько это касается программиста. size()
становится равным нулю, а capacity()
может изменяться или не изменяться. Но Стандарт не гарантирует, что используемая вектором память будет фактически возвращена операционной системе. Таким образом, если у вас было 1000 элементов в векторе до clear()
и каждый занимал 1000 байтов памяти, после clear()
вызывается деструктор каждого элемента, но вектор все еще может удерживать распределение в 1 000 000 байт.
Это иногда нежелательно. Вышеупомянутый «трюк обмена» имеет эффект обмена управляемой памятью между двумя векторами. Следовательно, decoy
завершается управляемым сбросом памяти.
Вот что происходит шаг за шагом:
decoy
элементов каждый erased
.
Деструкторы элементов
называется, а вектор size()
становится ноль. Фактическая память может
не быть освобожденным.
- В стеке создается новый вектор (
vector<weight> (decoy)
), и элементы из decoy
копируются в него. Поскольку decoy
было просто clear()
ed, никакие элементы не копируются во временный вектор. Однако, см. Правку ниже. Вы не знаете, что контролируемая память не поменялась местами.
- Временный вектор и
decoy
память меняются местами (.swap(decoy);
), в результате чего decoy
очищается и его память переносится во временный.
- Временная копия падает со стека, в результате чего ее память освобождается.
Это называется " трюк со свопом ".
РЕДАКТИРОВАТЬ: Как упоминает Майк, оригинальный программист делает это неправильно. Временный не должен быть построен на основе decoy
, он должен быть построен по умолчанию. Вы точно не знаете, что swap()
будет копировать только элементы, а не контролируемую память под ними.