Box

Умный указатель Box<T> в Rust используется для хранения данных в куче (heap) вместо стека (stack). Вот основные аспекты:

Тип Box<T> является умным указателем, поскольку он реализует трейт Deref, который позволяет обрабатывать значения Box<T> как ссылки. Когда значение Box<T> выходит из области видимости, данные кучи, на которые указывает box, также очищаются благодаря реализации типажа Drop.

Основное назначение Box:

  • Хранение данных в куче - когда данные слишком велики для стека
  • Рекурсивные структуры данных - когда размер типа неизвестен на этапе компиляции
  • Трейт-объекты - для динамической диспетчеризации

Примеры использования:

1. Базовое использование (как в вашем примере)

fn main() {
    let b = Box::new(5);  // i32 хранится в куче
    println!("b = {}", b); // Автоматическое разыменование
    println!("*b = {}", *b); // Явное разыменование
}

2. Рекурсивные структуры данных

#[derive(Debug)]
enum List {
    Cons(i32, Box<List>),
    Nil,
}

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

3. Большие структуры данных

struct BigData {
    data: [u8; 1000000], // 1MB данных - слишком много для стека
}

fn main() {
    let big_box = Box::new(BigData { data: [0; 1000000] });
    // Данные хранятся в куче, избегая переполнения стека
}

4. Трейт-объекты

trait Animal {
    fn speak(&self);
}

struct Dog;
struct Cat;

impl Animal for Dog {
    fn speak(&self) { println!("Woof!"); }
}

impl Animal for Cat {
    fn speak(&self) { println!("Meow!"); }
}

fn main() {
    let animals: Vec<Box<dyn Animal>> = vec![
        Box::new(Dog),
        Box::new(Cat),
    ];
    
    for animal in animals {
        animal.speak();
    }
}

Ключевые особенности:

  • Владение - Box владеет данными в куче
  • Автоматическое освобождение - память освобождается при выходе из области видимости
  • Нулевая стоимость - в runtime Box ведет себя как обычная ссылка
  • Безопасность - гарантии владения и заимствования Rust