Como 0A0D menciona, el efecto de swap
es intercambiar la memoria controlada subyacente entre los dos vectores. Pero esto garantiza un poco más de explicación.
Cuando clear
a vector
, los elementos se eliminan de ella, al menos en lo que respecta al programador. size()
se convierte en cero y capacity()
puede o no puede cambiar. Pero el estándar no garantiza que la memoria utilizada por el vector realmente se devuelva al sistema operativo. Entonces, si tenía 1000 elementos en el vector antes del clear()
y cada uno tomó 1000 bytes de memoria, después del clear()
se llama al destructor de cada elemento, pero el vector aún puede estar reteniendo una asignación de 1,000,000 de bytes.
Esto a veces es indeseable. El 'truco de intercambio' que anota arriba tiene el efecto de intercambiar la memoria controlada entre los dos vectores. Por lo tanto, decoy
termina con su reinicio de memoria controlada.
Esto es lo que sucede paso a paso:
decoy
elementos son cada erased
. Se llama a los destructores de los elementos y el vector size()
se convierte en cero. La memoria real puede no ser desasignada.
- Se construye un nuevo vector en la pila (
vector<weight> (decoy)
) y se copian los elementos de decoy
. Como decoy
fue solo clear()
ed, no se copiaron elementos en el vector temporal. Sin embargo, mira editar a continuación. Usted no sabe que la memoria controlada no se intercambia.
- La memoria del vector temporal y
decoy
se intercambian (.swap(decoy);
) dando como resultado decoy
siendo ambos borrados y su memoria transferida al temporal.
- El temporal se cae de la pila, lo que provoca que se elimine la memoria.
Esto se conoce como "the swap trick".
EDITAR: Como Mike menciona, el programador original lo está haciendo mal. El temporal no se debe construir basado en decoy
, solo debe ser construido por defecto. No está seguro de que swap()
solo copie los elementos y no la memoria controlada debajo.
Recuerde aceptar las respuestas que considere mejores haciendo clic en la marca de verificación –