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_halt
seja vinculado para que obtenhamos seu panic handler.- Este exemplo irá compilar, mas não executará, pois não possui um ponto de entrada.