Memory allocation APIs.
In a given program, the standard library has one “global” memory allocator that is used for example by Box<T> and Vec<T>.
Currently the default global allocator is unspecified. Libraries, however, like cdylibs and staticlibs are guaranteed to use the System by default.
#[global_allocator] attributeThis attribute allows configuring the choice of global allocator. You can use this to implement a completely custom global allocator to route all1 default allocation requests to a custom object.
use std::alloc::{GlobalAlloc, System, Layout};
struct MyAllocator;
unsafe impl GlobalAlloc for MyAllocator {
unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
unsafe { System.alloc(layout) }
}
unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {
unsafe { System.dealloc(ptr, layout) }
}
}
#[global_allocator]
static GLOBAL: MyAllocator = MyAllocator;
fn main() {
// This `Vec` will allocate memory through `GLOBAL` above
let mut v = Vec::new();
v.push(1);
}The attribute is used on a static item whose type implements the GlobalAlloc trait. This type can be provided by an external library:
use jemallocator::Jemalloc;
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;
fn main() {}
The #[global_allocator] can only be used once in a crate or its recursive dependencies.
Note that the Rust standard library internals may still directly call System when necessary (for example for the runtime support typically required to implement a global allocator, see re-entrance on GlobalAlloc for more details). ↩
LayoutError is returned when the parameters given to Layout::from_size_align or some other Layout constructor do not satisfy its documented constraints.AllocError error indicates an allocation failure that may be due to resource exhaustion or to something wrong when combining the given input arguments with this allocator.#[global_allocator] attribute.Allocator can allocate, grow, shrink, and deallocate arbitrary blocks of data described via Layout.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/alloc/index.html