Rust: seguridad de memoria con ownership y préstamos
En programación de sistemas, la memoria tiene un ciclo de vida. Usarla después de liberarla produce un use-after-free; liberarla dos veces provoca un double free; acceder fuera de sus límites puede corromper datos. C y C++ permiten control directo, aunque C++ también ofrece RAII y punteros inteligentes para administrar recursos. Rust convierte muchas reglas de uso en restricciones del lenguaje.
Propiedad y duración
Un valor tiene un propietario responsable de su ciclo de vida. Cuando el propietario sale de su ámbito, el valor se destruye y se ejecuta la limpieza correspondiente. Para tipos como String, una asignación puede transferir la propiedad: la variable original deja de poder usarse como dueña del mismo recurso.
let original = String::from("artículo");
let destino = original; // transfiere propiedad
println!("{}", destino); // válido
// println!("{}", original); // error de compilaciónAcceder mediante préstamos
Un préstamo permite acceder sin transferir la propiedad. Para el mismo dato, las reglas habituales permiten varias referencias compartidas &T o una referencia mutable exclusiva &mut T, sin usos incompatibles. Los lifetimes describen relaciones entre duraciones para evitar que una referencia sobreviva al dato. No son temporizadores ni prolongan una asignación.
Una función que cuenta caracteres puede recibir &str, consultar el texto y devolver un número sin adueñarse del String. Una función que modifica la colección necesita acceso mutable compatible con los préstamos existentes.
Concurrencia y alcance de las garantías
Una carrera de datos implica accesos concurrentes no sincronizados a la misma ubicación y al menos una escritura. Safe Rust evita estas carreras mediante tipos, préstamos y restricciones como Send y Sync. Compartir estado mutable puede requerir mecanismos como Arc<Mutex<T>>, que hacen explícita la sincronización.
Esto no elimina bloqueos mutuos ni carreras lógicas de negocio. También existen comprobaciones en ejecución: un índice fuera de rango puede provocar un panic, y algunos tipos verifican préstamos dinámicamente. El código unsafe permite operaciones adicionales cuyas invariantes requieren justificación.
Cuándo resulta útil
Rust no necesita un recolector de basura trazador para liberar sus recursos normales. Puede ser útil en herramientas de consola, servicios e infraestructura donde importan arranque, memoria y latencia. No garantiza superioridad de rendimiento: el algoritmo, las asignaciones y la carga siguen siendo decisivos. Su propuesta es detectar numerosas formas de uso inválido antes de ejecutar el programa.