Grunt's personal blog

this is my personal blog for my hacking stuff, my degree stuff, etc

View on GitHub

Smart pointers en Rust

Box<T>

Box es un puntero inteligente que asigna datos en el heap en lugar del stack. Es útil para almacenar datos grandes o estructuras recursivas.

fn main() {
    let five = Box::new(5);
    println!("five: {}", *five);
}

#[derive(Debug)]
enum List<T> {
    /// A non-empty list: first element and the rest of the list.
    Element(T, Box<List<T>>),
    /// An empty list.
    Nil,
}

fn main() {
    let list: List<i32> =
        List::Element(1, Box::new(List::Element(2, Box::new(List::Nil))));
    println!("{list:?}");
}

Características de Box<T>

Box es similar a std::unique_ptr en C++, pero garantiza que nunca será null.

Un Box es útil cuando:

Si no usáramos Box e intentáramos incrustar una Lista directamente en la Lista, el compilador no podría calcular un tamaño fijo para la estructura en memoria (la Lista sería de tamaño infinito).

Box resuelve este problema ya que tiene el mismo tamaño que un puntero regular y simplemente apunta al siguiente elemento de la Lista en el heap.

Ejemplo de error del compilador: Si eliminas Box de la definición de List, obtendrás el mensaje “recursive without indirection”, porque para recursión de datos, debemos usar indirección (Box o algún tipo de referencia) en lugar de almacenar el valor directamente.

Aunque Box se parece a std::unique_ptr en C++, no puede estar vacío/null. Esto hace que Box sea uno de los tipos que permiten al compilador optimizar el almacenamiento de algunos enums (la “optimización de nicho”).

Rc<T>

Rc es un puntero compartido con conteo de referencias. Úsalo cuando necesites referirte a los mismos datos desde múltiples lugares. (Rc standfs for Reference Counted).

use std::rc::Rc;

fn main() {
    let a = Rc::new(10);
    let b = Rc::clone(&a);

    dbg!(a);
    dbg!(b);
}

Características de Rc<T>