Uno de los aspectos que hace a Rust diferente de otros lenguajes es su forma de manejar la memoria.
Para entender el sistema de ownership, primero es indispensable comprender qué son el stack y el heap, ya que Rust toma decisiones distintas dependiendo de dónde se almacenen los datos.
Cuando un programa se ejecuta, utiliza principalmente dos áreas de memoria: stack y heap.
Ambas sirven para almacenar datos, pero lo hacen de maneras muy distintas.
El stack es una región de memoria rápida y ordenada. Funciona bajo el principio LIFO (Last In, First Out), es decir, el último valor en entrar es el primero en salir, lo que trae consigo varias ventajas:
- Velocidad, es memoria de rápido acceso
- Tamaño fijo y conocido en tiempo de compilación
- La memoria se libera automáticamente al salir del scope
- Es ideal para datos simples y pequeños
En Rust, los tipos primitivos suelen almacenarse en el stack, por ejemplo:
- Enteros (
i32,u8, etc.) - Booleanos (
bool) - Flotantes (
f32,f64) char- Tuplas y estructuras pequeñas con tamaño fijo
Cuando una variable del stack sale de su scope, Rust elimina automáticamente su valor.
El heap es una región de memoria más flexible, pero también más costosa de usar.
Aquí se almacenan datos cuyo tamaño no se conoce en tiempo de compilación o puede cambiar durante la ejecución. En comparación con el stack, el heap difiere en:
- Más lento que el stack
- Permite tamaños dinámicos
- Requiere gestión explícita
- Ideal para datos complejos o grandes
tipos como String, Vec<T> y otras estructuras dinámicas usan el heap.
Y funciona de la siguiente manera:
- Se reserva espacio dinámicamente
- Se obtiene una referencia (puntero) a esa memoria
- Esa referencia se guarda en el stack
El sistema de ownership es el mecanismo que se usa para gestionar automáticamente la memoria, sin garbage collector y sin requerir liberación manual.
Rust aplica estas reglas en tiempo de compilación:
- Cada valor tiene un único owner (dueño).
- Un valor solo puede tener un owner a la vez.
- Cuando el owner sale del scope, el valor se libera automáticamente.
El scope es el rango del programa donde una variable es válida y puede ser utilizada.
Generalmente está delimitado por llaves {}.
Cuando una variable sale de su scope:
- Si estaba en el stack, se elimina inmediatamente
- Si era dueña de memoria en el heap, Rust libera esa memoria automáticamente