alloc
Para usar alloc, você deve implementar um alocador global (heap).
#![no_main]
#![no_std]
extern crate alloc;
extern crate panic_halt as _;
use alloc::string::ToString;
use alloc::vec::Vec;
use buddy_system_allocator::LockedHeap;
#[global_allocator]
static HEAP_ALLOCATOR: LockedHeap<32> = LockedHeap::<32>::new();
static mut HEAP: [u8; 65536] = [0; 65536];
pub fn entry() {
// SEGURANÇA: `HEAP` é usado apenas aqui e `entry` é chamado apenas uma vez.
unsafe {
// Dê ao alocador alguma memória para alocar.
HEAP_ALLOCATOR.lock().init(HEAP.as_mut_ptr() as usize, HEAP.len());
}
// Agora podemos fazer coisas que exigem alocação de heap.
let mut v = Vec::new();
v.push("Uma string".to_string());
}
buddy_system_allocatoré um crate de terceiros que implementa um alocador básico de sistema de buddy. Outros crates estão disponíveis, ou você pode escrever o seu próprio ou conectar-se ao seu alocador existente.- O parâmetro const de
LockedHeapé a ordem máxima do alocador; ou seja, neste caso, ele pode alocar regiões de até 2**32 bytes. - Se algum crate na sua árvore de dependências depender de
alloc, você deve ter exatamente um alocador global definido no seu binário. Normalmente, isso é feito no crate binário de mais alto nível. extern crate panic_halt as _é necessário para garantir que o cratepanic_haltseja vinculado para que obtenhamos seu panic handler.- Este exemplo irá compilar, mas não executará, pois não possui um ponto de entrada.