Struct Box

pub struct Box<T: ?Sized, A: Allocator = Global>(pub(in ::boxed) Unique<T>, pub(in ::boxed) A);

A pointer type that uniquely owns a heap allocation of type T.

See the module-level documentation for more.

Fields

0: Unique<T>
1: A

Implementations

impl<A: Allocator> Box<dyn Any + Send + Sync, A>

fn downcast<T: Any>(self) -> Result<Box<T, A>, Self>

Attempts to downcast the box to a concrete type.

Examples

use std::any::Any;

fn print_if_string(value: Box<dyn Any + Send + Sync>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A>

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples

#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any + Send + Sync> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}

Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

impl<A: Allocator> Box<dyn Any + Send, A>

fn downcast<T: Any>(self) -> Result<Box<T, A>, Self>

Attempts to downcast the box to a concrete type.

Examples

use std::any::Any;

fn print_if_string(value: Box<dyn Any + Send>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A>

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples

#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any + Send> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}

Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

impl<A: Allocator> Box<dyn Any, A>

fn downcast<T: Any>(self) -> Result<Box<T, A>, Self>

Attempts to downcast the box to a concrete type.

Examples

use std::any::Any;

fn print_if_string(value: Box<dyn Any>) {
    if let Ok(string) = value.downcast::<String>() {
        println!("String ({}): {}", string.len(), string);
    }
}

let my_string = "Hello World".to_string();
print_if_string(Box::new(my_string));
print_if_string(Box::new(0i8));
unsafe fn downcast_unchecked<T: Any>(self) -> Box<T, A>

Downcasts the box to a concrete type.

For a safe alternative see downcast.

Examples

#![feature(downcast_unchecked)]

use std::any::Any;

let x: Box<dyn Any> = Box::new(1_usize);

unsafe {
    assert_eq!(*x.downcast_unchecked::<usize>(), 1);
}

Safety

The contained value must be of type T. Calling this method with the incorrect type is undefined behavior.

impl<T> Box<T>

fn new(x: T) -> Self

Allocates memory on the heap and then places x into it.

This doesn't actually allocate if T is zero-sized.

Examples

let five = Box::new(5);
const fn new_uninit() -> Box<MaybeUninit<T>>

Constructs a new box with uninitialized contents.

Examples

let mut five = Box::<u32>::new_uninit();
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };

assert_eq!(*five, 5)
fn new_zeroed() -> Box<MaybeUninit<T>>

Constructs a new Box with uninitialized contents, with the memory being filled with 0 bytes.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

let zero = Box::<u32>::new_zeroed();
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0)
fn pin(x: T) -> Pin<Box<T>>

Constructs a new Pin<Box<T>>. If T does not implement Unpin, then x will be pinned in memory and unable to be moved.

Constructing and pinning of the Box can also be done in two steps: Box::pin(x) does the same as [Box::into_pin]([Box::new](x)). Consider using into_pin if you already have a Box<T>, or if you want to construct a (pinned) Box in a different way than with Box::new.

fn try_new(x: T) -> Result<Self, AllocError>

Allocates memory on the heap then places x into it, returning an error if the allocation fails

This doesn't actually allocate if T is zero-sized.

Examples

#![feature(allocator_ext)]

let five = Box::try_new(5)?;
# Ok::<(), std::alloc::AllocError>(())
fn try_new_uninit() -> Result<Box<MaybeUninit<T>>, AllocError>

Constructs a new box with uninitialized contents on the heap, returning an error if the allocation fails

Examples

#![feature(allocator_ext)]

let mut five = Box::<u32>::try_new_uninit()?;
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };

assert_eq!(*five, 5);
# Ok::<(), std::alloc::AllocError>(())
fn try_new_zeroed() -> Result<Box<MaybeUninit<T>>, AllocError>

Constructs a new Box with uninitialized contents, with the memory being filled with 0 bytes on the heap

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

let zero = Box::<u32>::try_new_zeroed()?;
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0);
# Ok::<(), std::alloc::AllocError>(())

impl<T> Box<[T]>

fn new_uninit_slice(len: usize) -> Box<[MaybeUninit<T>]>

Constructs a new boxed slice with uninitialized contents.

Examples

let mut values = Box::<[u32]>::new_uninit_slice(3);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3])
fn new_zeroed_slice(len: usize) -> Box<[MaybeUninit<T>]>

Constructs a new boxed slice with uninitialized contents, with the memory being filled with 0 bytes.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

let values = Box::<[u32]>::new_zeroed_slice(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0])
fn try_new_uninit_slice(len: usize) -> Result<Box<[MaybeUninit<T>]>, AllocError>

Constructs a new boxed slice with uninitialized contents. Returns an error if the allocation fails.

Examples

#![feature(allocator_ext)]

let mut values = Box::<[u32]>::try_new_uninit_slice(3)?;
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3]);
# Ok::<(), std::alloc::AllocError>(())
fn try_new_zeroed_slice(len: usize) -> Result<Box<[MaybeUninit<T>]>, AllocError>

Constructs a new boxed slice with uninitialized contents, with the memory being filled with 0 bytes. Returns an error if the allocation fails.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

let values = Box::<[u32]>::try_new_zeroed_slice(3)?;
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0]);
# Ok::<(), std::alloc::AllocError>(())

impl<T, A: Allocator> Box<MaybeUninit<T>, A>

const unsafe fn assume_init(self) -> Box<T, A>

Converts to Box<T, A>.

Safety

As with MaybeUninit::assume_init, it is up to the caller to guarantee that the value really is in an initialized state. Calling this when the content is not yet fully initialized causes immediate undefined behavior.

Examples

let mut five = Box::<u32>::new_uninit();
// Deferred initialization:
five.write(5);
let five: Box<u32> = unsafe { five.assume_init() };

assert_eq!(*five, 5)
fn write(boxed: Self, value: T) -> Box<T, A>

Writes the value and converts to Box<T, A>.

This method converts the box similarly to Box::assume_init but writes value into it before conversion thus guaranteeing safety. In some scenarios use of this method may improve performance because the compiler may be able to optimize copying from stack.

Examples

let big_box = Box::<[usize; 1024]>::new_uninit();

let mut array = [0; 1024];
for (i, place) in array.iter_mut().enumerate() {
    *place = i;
}

// The optimizer may be able to elide this copy, so previous code writes
// to heap directly.
let big_box = Box::write(big_box, array);

for (i, x) in big_box.iter().enumerate() {
    assert_eq!(*x, i);
}

impl<T, A: Allocator> Box<T, A>

fn new_in(x: T, alloc: A) -> Self

Allocates memory in the given allocator then places x into it.

This doesn't actually allocate if T is zero-sized.

Examples

use std::alloc::System;

let five = Box::new_in(5, System);
fn try_new_in(x: T, alloc: A) -> Result<Self, AllocError>

Allocates memory in the given allocator then places x into it, returning an error if the allocation fails

This doesn't actually allocate if T is zero-sized.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let five = Box::try_new_in(5, System)?;
# Ok::<(), std::alloc::AllocError>(())
fn new_uninit_in(alloc: A) -> Box<MaybeUninit<T>, A>

Constructs a new box with uninitialized contents in the provided allocator.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let mut five = Box::<u32, _>::new_uninit_in(System);
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };

assert_eq!(*five, 5)
fn try_new_uninit_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>

Constructs a new box with uninitialized contents in the provided allocator, returning an error if the allocation fails

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let mut five = Box::<u32, _>::try_new_uninit_in(System)?;
// Deferred initialization:
five.write(5);
let five = unsafe { five.assume_init() };

assert_eq!(*five, 5);
# Ok::<(), std::alloc::AllocError>(())
fn new_zeroed_in(alloc: A) -> Box<MaybeUninit<T>, A>

Constructs a new Box with uninitialized contents, with the memory being filled with 0 bytes in the provided allocator.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let zero = Box::<u32, _>::new_zeroed_in(System);
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0)
fn try_new_zeroed_in(alloc: A) -> Result<Box<MaybeUninit<T>, A>, AllocError>

Constructs a new Box with uninitialized contents, with the memory being filled with 0 bytes in the provided allocator, returning an error if the allocation fails,

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let zero = Box::<u32, _>::try_new_zeroed_in(System)?;
let zero = unsafe { zero.assume_init() };

assert_eq!(*zero, 0);
# Ok::<(), std::alloc::AllocError>(())
fn pin_in(x: T, alloc: A) -> Pin<Self>
where
    A: StaticAllocator,

Constructs a new Pin<Box<T, A>>. If T does not implement Unpin, then x will be pinned in memory and unable to be moved.

Constructing and pinning of the Box can also be done in two steps: Box::pin_in(x, alloc) does the same as [Box::into_pin]([Box::new_in](x, alloc)). Consider using into_pin if you already have a Box<T, A>, or if you want to construct a (pinned) Box in a different way than with Box::new_in.

Examples

#![feature(allocator_ext)]
use std::alloc::System;

let x = Box::pin_in(1, System);
fn into_boxed_slice(boxed: Self) -> Box<[T], A>

Converts a Box<T> into a Box<[T]>

This conversion does not allocate on the heap and happens in place.

fn into_inner(boxed: Self) -> T

Consumes the Box, returning the wrapped value.

Examples

#![feature(box_into_inner)]

let c = Box::new(5);

assert_eq!(Box::into_inner(c), 5);
fn take(boxed: Self) -> (T, Box<MaybeUninit<T>, A>)

Consumes the Box without consuming its allocation, returning the wrapped value and a Box to the uninitialized memory where the wrapped value used to live.

This can be used together with write to reuse the allocation for multiple boxed values.

Examples

let c = Box::new(5);

// take the value out of the box
let (value, uninit) = Box::take(c);
assert_eq!(value, 5);

// reuse the box for a second value
let c = Box::write(uninit, 6);
assert_eq!(*c, 6);
fn map<U>(this: Self, f: impl FnOnce(T) -> U) -> Box<U, A>

Maps the value in a box, reusing the allocation if possible.

f is called on the value in the box, and the result is returned, also boxed.

Note: this is an associated function, which means that you have to call it as Box::map(b, f) instead of b.map(f). This is so that there is no conflict with a method on the inner type.

Examples

let b = Box::new(7);
let new = Box::map(b, |i| i + 7);
assert_eq!(*new, 14);
fn try_map<R>(this: Self, f: impl FnOnce(T) -> R) -> <R::Residual as Residual<Box<R::Output, A>>>::TryType
where
    R: Try,
    R::Residual: Residual<Box<R::Output, A>>,

Attempts to map the value in a box, reusing the allocation if possible.

f is called on the value in the box, and if the operation succeeds, the result is returned, also boxed.

Note: this is an associated function, which means that you have to call it as Box::try_map(b, f) instead of b.try_map(f). This is so that there is no conflict with a method on the inner type.

Examples

#![feature(smart_pointer_try_map)]

let b = Box::new(7);
let new = Box::try_map(b, u32::try_from).unwrap();
assert_eq!(*new, 7);

impl<T, A: Allocator> Box<[MaybeUninit<T>], A>

unsafe fn assume_init(self) -> Box<[T], A>

Converts to Box<[T], A>.

Safety

As with MaybeUninit::assume_init, it is up to the caller to guarantee that the values really are in an initialized state. Calling this when the content is not yet fully initialized causes immediate undefined behavior.

Examples

let mut values = Box::<[u32]>::new_uninit_slice(3);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3])

impl<T, A: Allocator> Box<[T], A>

fn new_uninit_slice_in(len: usize, alloc: A) -> Box<[MaybeUninit<T>], A>

Constructs a new boxed slice with uninitialized contents in the provided allocator.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let mut values = Box::<[u32], _>::new_uninit_slice_in(3, System);
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3])
fn new_zeroed_slice_in(len: usize, alloc: A) -> Box<[MaybeUninit<T>], A>

Constructs a new boxed slice with uninitialized contents in the provided allocator, with the memory being filled with 0 bytes.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let values = Box::<[u32], _>::new_zeroed_slice_in(3, System);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0])
fn try_new_uninit_slice_in(len: usize, alloc: A) -> Result<Box<[MaybeUninit<T>], A>, AllocError>

Constructs a new boxed slice with uninitialized contents in the provided allocator. Returns an error if the allocation fails.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let mut values = Box::<[u32], _>::try_new_uninit_slice_in(3, System)?;
// Deferred initialization:
values[0].write(1);
values[1].write(2);
values[2].write(3);
let values = unsafe { values.assume_init() };

assert_eq!(*values, [1, 2, 3]);
# Ok::<(), std::alloc::AllocError>(())
fn try_new_zeroed_slice_in(len: usize, alloc: A) -> Result<Box<[MaybeUninit<T>], A>, AllocError>

Constructs a new boxed slice with uninitialized contents in the provided allocator, with the memory being filled with 0 bytes. Returns an error if the allocation fails.

See MaybeUninit::zeroed for examples of correct and incorrect usage of this method.

Examples

#![feature(allocator_ext)]

use std::alloc::System;

let values = Box::<[u32], _>::try_new_zeroed_slice_in(3, System)?;
let values = unsafe { values.assume_init() };

assert_eq!(*values, [0, 0, 0]);
# Ok::<(), std::alloc::AllocError>(())
fn into_array<const N: usize>(self) -> Result<Box<[T; N], A>, Self>

Converts the boxed slice into a boxed array.

This operation does not reallocate; the underlying array of the slice is simply reinterpreted as an array type.

Errors

Returns the original Box<[T]> in the Err variant if self.len() does not equal N.

Examples

#![feature(alloc_slice_into_array)]
let box_slice: Box<[i32]> = Box::new([1, 2, 3]);

let box_array: Box<[i32; 3]> = box_slice.into_array().unwrap();

impl<T: ?Sized + CloneToUninit> Box<T>

fn clone_from_ref(src: &T) -> Box<T>

Allocates memory on the heap then clones src into it.

This doesn't actually allocate if src is zero-sized.

Examples

#![feature(clone_from_ref)]

let hello: Box<str> = Box::clone_from_ref("hello");
fn try_clone_from_ref(src: &T) -> Result<Box<T>, AllocError>

Allocates memory on the heap then clones src into it, returning an error if allocation fails.

This doesn't actually allocate if src is zero-sized.

Examples

#![feature(clone_from_ref)]

let hello: Box<str> = Box::try_clone_from_ref("hello")?;
# Ok::<(), std::alloc::AllocError>(())

impl<T: ?Sized + CloneToUninit, A: Allocator> Box<T, A>

fn clone_from_ref_in(src: &T, alloc: A) -> Box<T, A>

Allocates memory in the given allocator then clones src into it.

This doesn't actually allocate if src is zero-sized.

Examples

#![feature(clone_from_ref)]

use std::alloc::System;

let hello: Box<str, System> = Box::clone_from_ref_in("hello", System);
fn try_clone_from_ref_in(src: &T, alloc: A) -> Result<Box<T, A>, AllocError>

Allocates memory in the given allocator then clones src into it, returning an error if allocation fails.

This doesn't actually allocate if src is zero-sized.

Examples

#![feature(clone_from_ref)]

use std::alloc::System;

let hello: Box<str, System> = Box::try_clone_from_ref_in("hello", System)?;
# Ok::<(), std::alloc::AllocError>(())

impl<T: ?Sized> Box<T>

unsafe fn from_raw(raw: *mut T) -> Self

Constructs a box from a raw pointer.

After calling this function, the raw pointer is owned by the resulting Box. Specifically, the Box destructor will call the destructor of T and free the allocated memory. For this to be safe, the memory must have been allocated in accordance with the memory layout used by Box .

Safety

This function is unsafe because improper use may lead to memory problems. For example, a double-free may occur if the function is called twice on the same raw pointer.

The raw pointer must point to a block of memory allocated by the global allocator.

The safety conditions are described in the memory layout section. Note that the considerations for unsafe code apply to all Box<T> values.

Examples

Recreate a Box which was previously converted to a raw pointer using [Box::into_raw]:

let x = Box::new(5);
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };

Manually create a Box from scratch by using the global allocator:

use std::alloc::{alloc, Layout};

unsafe {
    let ptr = alloc(Layout::new::<i32>()) as *mut i32;
    // In general .write is required to avoid attempting to destruct
    // the (uninitialized) previous contents of `ptr`, though for this
    // simple example `*ptr = 5` would have worked as well.
    ptr.write(5);
    let x = Box::from_raw(ptr);
}
unsafe fn from_non_null(ptr: NonNull<T>) -> Self

Constructs a box from a NonNull pointer.

After calling this function, the NonNull pointer is owned by the resulting Box. Specifically, the Box destructor will call the destructor of T and free the allocated memory. For this to be safe, the memory must have been allocated in accordance with the memory layout used by Box .

Safety

This function is unsafe because improper use may lead to memory problems. For example, a double-free may occur if the function is called twice on the same NonNull pointer.

The non-null pointer must point to a block of memory allocated by the global allocator.

The safety conditions are described in the memory layout section. Note that the considerations for unsafe code apply to all Box<T> values.

Examples

Recreate a Box which was previously converted to a NonNull pointer using [Box::into_non_null]:

let x = Box::new(5);
let non_null = Box::into_non_null(x);
let x = unsafe { Box::from_non_null(non_null) };

Manually create a Box from scratch by using the global allocator:

use std::alloc::{alloc, Layout};
use std::ptr::NonNull;

unsafe {
    let non_null = NonNull::new(alloc(Layout::new::<i32>()).cast::<i32>())
        .expect("alloc should have successfully allocated memory");
    // In general .write is required to avoid attempting to destruct
    // the (uninitialized) previous contents of `non_null`.
    non_null.write(5);
    let x = Box::from_non_null(non_null);
}
fn into_raw(b: Self) -> *mut T

Consumes the Box, returning a wrapped raw pointer.

The pointer will be properly aligned and non-null.

After calling this function, the caller is responsible for the memory previously managed by the Box. In particular, the caller should properly destroy T and release the memory, taking into account the memory layout used by Box. The easiest way to do this is to convert the raw pointer back into a Box with the Box::from_raw function, allowing the Box destructor to perform the cleanup.

Note: this is an associated function, which means that you have to call it as Box::into_raw(b) instead of b.into_raw(). This is so that there is no conflict with a method on the inner type.

Examples

Converting the raw pointer back into a Box with Box::from_raw for automatic cleanup:

let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
let x = unsafe { Box::from_raw(ptr) };

Manual cleanup by explicitly running the destructor and deallocating the memory:

use std::alloc::{dealloc, Layout};
use std::ptr;

let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
unsafe {
    ptr::drop_in_place(ptr);
    dealloc(ptr as *mut u8, Layout::new::<String>());
}

Note: This is equivalent to the following:

let x = Box::new(String::from("Hello"));
let ptr = Box::into_raw(x);
unsafe {
    drop(Box::from_raw(ptr));
}
fn into_non_null(b: Self) -> NonNull<T>

Consumes the Box, returning a wrapped NonNull pointer.

The pointer will be properly aligned.

After calling this function, the caller is responsible for the memory previously managed by the Box. In particular, the caller should properly destroy T and release the memory, taking into account the memory layout used by Box. The easiest way to do this is to convert the NonNull pointer back into a Box with the Box::from_non_null function, allowing the Box destructor to perform the cleanup.

Note: this is an associated function, which means that you have to call it as Box::into_non_null(b) instead of b.into_non_null(). This is so that there is no conflict with a method on the inner type.

Examples

Converting the NonNull pointer back into a Box with Box::from_non_null for automatic cleanup:

let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
let x = unsafe { Box::from_non_null(non_null) };

Manual cleanup by explicitly running the destructor and deallocating the memory:

use std::alloc::{dealloc, Layout};

let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
unsafe {
    non_null.drop_in_place();
    dealloc(non_null.as_ptr().cast::<u8>(), Layout::new::<String>());
}

Note: This is equivalent to the following:

let x = Box::new(String::from("Hello"));
let non_null = Box::into_non_null(x);
unsafe {
    drop(Box::from_non_null(non_null));
}

impl<T: ?Sized, A: Allocator> Box<T, A>

unsafe fn from_raw_in(raw: *mut T, alloc: A) -> Self

Constructs a box from a raw pointer in the given allocator.

After calling this function, the raw pointer is owned by the resulting Box. Specifically, the Box destructor will call the destructor of T and free the allocated memory. For this to be safe, the memory must have been allocated in accordance with the memory layout used by Box .

Safety

This function is unsafe because improper use may lead to memory problems. For example, a double-free may occur if the function is called twice on the same raw pointer.

The raw pointer must point to a block of memory allocated by alloc.

The safety conditions are described in the memory layout section. Note that the considerations for unsafe code apply to all Box<T, A> values.

Examples

Recreate a Box which was previously converted to a raw pointer using [Box::into_raw_with_allocator]:

use std::alloc::System;

let x = Box::new_in(5, System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
let x = unsafe { Box::from_raw_in(ptr, alloc) };

Manually create a Box from scratch by using the system allocator:

#![feature(slice_ptr_get)]

use std::alloc::{Allocator, Layout, System};

unsafe {
    let ptr = System.allocate(Layout::new::<i32>())?.as_mut_ptr() as *mut i32;
    // In general .write is required to avoid attempting to destruct
    // the (uninitialized) previous contents of `ptr`, though for this
    // simple example `*ptr = 5` would have worked as well.
    ptr.write(5);
    let x = Box::from_raw_in(ptr, System);
}
# Ok::<(), std::alloc::AllocError>(())
unsafe fn from_non_null_in(raw: NonNull<T>, alloc: A) -> Self

Constructs a box from a NonNull pointer in the given allocator.

After calling this function, the NonNull pointer is owned by the resulting Box. Specifically, the Box destructor will call the destructor of T and free the allocated memory. For this to be safe, the memory must have been allocated in accordance with the memory layout used by Box .

Safety

This function is unsafe because improper use may lead to memory problems. For example, a double-free may occur if the function is called twice on the same raw pointer.

The non-null pointer must point to a block of memory allocated by alloc.

The safety conditions are described in the memory layout section. Note that the considerations for unsafe code apply to all Box<T, A> values.

Examples

Recreate a Box which was previously converted to a NonNull pointer using [Box::into_non_null_with_allocator]:

use std::alloc::System;

let x = Box::new_in(5, System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
let x = unsafe { Box::from_non_null_in(non_null, alloc) };

Manually create a Box from scratch by using the system allocator:

use std::alloc::{Allocator, Layout, System};

unsafe {
    let non_null = System.allocate(Layout::new::<i32>())?.cast::<i32>();
    // In general .write is required to avoid attempting to destruct
    // the (uninitialized) previous contents of `non_null`.
    non_null.write(5);
    let x = Box::from_non_null_in(non_null, System);
}
# Ok::<(), std::alloc::AllocError>(())
const fn into_raw_with_allocator(b: Self) -> (*mut T, A)

Consumes the Box, returning a wrapped raw pointer and the allocator.

The pointer will be properly aligned and non-null.

After calling this function, the caller is responsible for the memory previously managed by the Box. In particular, the caller should properly destroy T and release the memory, taking into account the memory layout used by Box. The easiest way to do this is to convert the raw pointer back into a Box with the Box::from_raw_in function, allowing the Box destructor to perform the cleanup.

Note: this is an associated function, which means that you have to call it as Box::into_raw_with_allocator(b) instead of b.into_raw_with_allocator(). This is so that there is no conflict with a method on the inner type.

Examples

Converting the raw pointer back into a Box with Box::from_raw_in for automatic cleanup:

use std::alloc::System;

let x = Box::new_in(String::from("Hello"), System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
let x = unsafe { Box::from_raw_in(ptr, alloc) };

Manual cleanup by explicitly running the destructor and deallocating the memory:

use std::alloc::{Allocator, Layout, System};
use std::ptr::{self, NonNull};

let x = Box::new_in(String::from("Hello"), System);
let (ptr, alloc) = Box::into_raw_with_allocator(x);
unsafe {
    ptr::drop_in_place(ptr);
    let non_null = NonNull::new_unchecked(ptr);
    alloc.deallocate(non_null.cast(), Layout::new::<String>());
}
fn into_non_null_with_allocator(b: Self) -> (NonNull<T>, A)

Consumes the Box, returning a wrapped NonNull pointer and the allocator.

The pointer will be properly aligned.

After calling this function, the caller is responsible for the memory previously managed by the Box. In particular, the caller should properly destroy T and release the memory, taking into account the memory layout used by Box. The easiest way to do this is to convert the NonNull pointer back into a Box with the Box::from_non_null_in function, allowing the Box destructor to perform the cleanup.

Note: this is an associated function, which means that you have to call it as Box::into_non_null_with_allocator(b) instead of b.into_non_null_with_allocator(). This is so that there is no conflict with a method on the inner type.

Examples

Converting the NonNull pointer back into a Box with Box::from_non_null_in for automatic cleanup:

use std::alloc::System;

let x = Box::new_in(String::from("Hello"), System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
let x = unsafe { Box::from_non_null_in(non_null, alloc) };

Manual cleanup by explicitly running the destructor and deallocating the memory:

use std::alloc::{Allocator, Layout, System};

let x = Box::new_in(String::from("Hello"), System);
let (non_null, alloc) = Box::into_non_null_with_allocator(x);
unsafe {
    non_null.drop_in_place();
    alloc.deallocate(non_null.cast::<u8>(), Layout::new::<String>());
}
fn as_mut_ptr(b: &mut Self) -> *mut T

Returns a raw mutable pointer to the Box's contents.

The caller must ensure that the Box outlives the pointer this function returns, or else it will end up dangling.

This method guarantees that for the purpose of the aliasing model, this method does not materialize a reference to the underlying memory, and thus the returned pointer will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null. Note that calling other methods that materialize references to the memory may still invalidate this pointer. See the example below for how this guarantee can be used.

Examples

Due to the aliasing guarantee, the following code is legal:

unsafe {
    let mut b = Box::new(0);
    let ptr1 = Box::as_mut_ptr(&mut b);
    ptr1.write(1);
    let ptr2 = Box::as_mut_ptr(&mut b);
    ptr2.write(2);
    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
    ptr1.write(3);
}
fn as_ptr(b: &Self) -> *const T

Returns a raw pointer to the Box's contents.

The caller must ensure that the Box outlives the pointer this function returns, or else it will end up dangling.

The caller must also ensure that the memory the pointer (non-transitively) points to is never written to (except inside an UnsafeCell) using this pointer or any pointer derived from it. If you need to mutate the contents of the Box, use as_mut_ptr.

This method guarantees that for the purpose of the aliasing model, this method does not materialize a reference to the underlying memory, and thus the returned pointer will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null. Note that calling other methods that materialize mutable references to the memory, as well as writing to this memory, may still invalidate this pointer. See the example below for how this guarantee can be used.

Examples

Due to the aliasing guarantee, the following code is legal:

unsafe {
    let mut v = Box::new(0);
    let ptr1 = Box::as_ptr(&v);
    let ptr2 = Box::as_mut_ptr(&mut v);
    let _val = ptr2.read();
    // No write to this memory has happened yet, so `ptr1` is still valid.
    let _val = ptr1.read();
    // However, once we do a write...
    ptr2.write(1);
    // ... `ptr1` is no longer valid.
    // This would be UB: let _val = ptr1.read();
}
fn as_non_null(b: &mut Self) -> NonNull<T>

Returns a NonNull pointer to the Box's contents.

The caller must ensure that the Box outlives the pointer this function returns, or else it will end up dangling.

This method guarantees that for the purpose of the aliasing model, this method does not materialize a reference to the underlying memory, and thus the returned pointer will remain valid when mixed with other calls to as_ptr, as_mut_ptr, and as_non_null. Note that calling other methods that materialize references to the memory may still invalidate this pointer. See the example below for how this guarantee can be used.

Examples

Due to the aliasing guarantee, the following code is legal:

#![feature(box_as_non_null)]

unsafe {
    let mut b = Box::new(0);
    let ptr1 = Box::as_non_null(&mut b);
    ptr1.write(1);
    let ptr2 = Box::as_non_null(&mut b);
    ptr2.write(2);
    // Notably, the write to `ptr2` did *not* invalidate `ptr1`:
    ptr1.write(3);
}
fn allocator(b: &Self) -> &A

Returns a reference to the underlying allocator.

Note: this is an associated function, which means that you have to call it as Box::allocator(&b) instead of b.allocator(). This is so that there is no conflict with a method on the inner type.

fn leak<'a>(b: Self) -> &'a mut T
where
    A: 'a,

Consumes and leaks the Box, returning a mutable reference, &'a mut T.

Note that the type T must outlive the chosen lifetime 'a. If the type has only static references, or none at all, then this may be chosen to be 'static.

This function is mainly useful for data that lives for the remainder of the program's life, i.e., memory that is meant to leak. If the memory should eventually be freed, prefer to use Box::into_raw or Box::into_non_null instead. Reconstructing ("unleaking") a Box from the mutable reference returned here (e.g. via Box::from_raw) is only possible if the allocator is Global, and even then it is a grey area (meaning it is possible under specific circumstances but many seemingly harmless ways of doing it are undefined behavior) and should be avoided.

Note: this is an associated function, which means that you have to call it as Box::leak(b) instead of b.leak(). This is so that there is no conflict with a method on the inner type.

Examples

Simple usage:

let x = Box::new(41);
let static_ref: &'static mut usize = Box::leak(x);
*static_ref += 1;
assert_eq!(*static_ref, 42);
# // FIXME(https://github.com/rust-lang/miri/issues/3670):
# // use -Zmiri-disable-leak-check instead of unleaking in tests meant to leak.
# drop(unsafe { Box::from_raw(static_ref) });

Unsized data:

let x = vec![1, 2, 3].into_boxed_slice();
let static_ref = Box::leak(x);
static_ref[0] = 4;
assert_eq!(*static_ref, [4, 2, 3]);
# // FIXME(https://github.com/rust-lang/miri/issues/3670):
# // use -Zmiri-disable-leak-check instead of unleaking in tests meant to leak.
# drop(unsafe { Box::from_raw(static_ref) });
fn into_pin(boxed: Self) -> Pin<Self>
where
    A: StaticAllocator,

Converts a Box<T> into a Pin<Box<T>>. If T does not implement Unpin, then *boxed will be pinned in memory and unable to be moved.

This conversion does not allocate on the heap and happens in place.

This is also available via From.

Constructing and pinning a Box with Box::into_pin([Box::new](x)) can also be written more concisely using [Box::pin](x). This into_pin method is useful if you already have a Box<T>, or you are constructing a (pinned) Box in a different way than with Box::new.

Notes

It's not recommended that crates add an impl like From<Box<T>> for Pin<T>, as it'll introduce an ambiguity when calling Pin::from. A demonstration of such a poor impl is shown below.

# use std::pin::Pin;
struct Foo; // A type defined in this crate.
impl From<Box<()>> for Pin<Foo> {
    fn from(_: Box<()>) -> Pin<Foo> {
        Pin::new(Foo)
    }
}

let foo = Box::new(());
let bar = Pin::from(foo);

Trait Implementations

impl Default for Box<CStr>

fn default() -> Box<CStr>

impl Default for Box<str>

fn default() -> Self

impl From<&CStr> for Box<CStr>

fn from(s: &CStr) -> Box<CStr>

Converts a &CStr into a Box<CStr>, by copying the contents into a newly allocated Box.

impl From<&mut CStr> for Box<CStr>

fn from(s: &mut CStr) -> Box<CStr>

Converts a &mut CStr into a Box<CStr>, by copying the contents into a newly allocated Box.

impl From<&mut str> for Box<str>

fn from(s: &mut str) -> Box<str>

Converts a &mut str into a Box<str>

This conversion allocates on the heap and performs a copy of s.

Examples

let mut original = String::from("hello");
let original: &mut str = &mut original;
let boxed: Box<str> = Box::from(original);
println!("{boxed}");

impl From<&str> for Box<str>

fn from(s: &str) -> Box<str>

Converts a &str into a Box<str>

This conversion allocates on the heap and performs a copy of s.

Examples

let boxed: Box<str> = Box::from("hello");
println!("{boxed}");

impl From<Box<ByteStr>> for Box<[u8]>

fn from(s: Box<ByteStr>) -> Box<[u8]>

impl From<Box<[u8]>> for Box<ByteStr>

fn from(s: Box<[u8]>) -> Box<ByteStr>

impl From<CString> for Box<CStr>

fn from(s: CString) -> Box<CStr>

Converts a CString into a [Box]<[CStr]> without copying or allocating.

impl From<Cow<'_, CStr>> for Box<CStr>

fn from(cow: Cow<'_, CStr>) -> Box<CStr>

Converts a Cow<'a, CStr> into a Box<CStr>, by copying the contents if they are borrowed.

impl From<Cow<'_, str>> for Box<str>

fn from(cow: Cow<'_, str>) -> Box<str>

Converts a Cow<'_, str> into a Box<str>

When cow is the Cow::Borrowed variant, this conversion allocates on the heap and copies the underlying str. Otherwise, it will try to reuse the owned String's allocation.

Examples

use std::borrow::Cow;

let unboxed = Cow::Borrowed("hello");
let boxed: Box<str> = Box::from(unboxed);
println!("{boxed}");
# use std::borrow::Cow;
let unboxed = Cow::Owned("hello".to_string());
let boxed: Box<str> = Box::from(unboxed);
println!("{boxed}");

impl From<String> for Box<str>

fn from(s: String) -> Box<str>

Converts the given String to a boxed str slice that is owned.

Examples

let s1: String = String::from("hello world");
let s2: Box<str> = Box::from(s1);
let s3: String = String::from(s2);

assert_eq!("hello world", s3)

impl FromIterator<String> for Box<str>

fn from_iter<I: IntoIterator<Item = String>>(iter: I) -> Self

impl FromIterator<char> for Box<str>

fn from_iter<I: IntoIterator<Item = char>>(iter: I) -> Self

impl<'a> From<&str> for Box<dyn Error + 'a>

fn from(err: &str) -> Box<dyn Error + 'a>

Converts a str into a box of dyn Error.

Examples

use std::error::Error;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error>::from(a_str_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))

impl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a>

fn from(err: &str) -> Box<dyn Error + Send + Sync + 'a>

Converts a str into a box of dyn Error + Send + Sync.

Examples

use std::error::Error;

let a_str_error = "a str error";
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_str_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))

impl<'a> From<String> for Box<dyn Error + 'a>

fn from(str_err: String) -> Box<dyn Error + 'a>

Converts a String into a box of dyn Error.

Examples

use std::error::Error;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error>::from(a_string_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))

impl<'a> From<String> for Box<dyn Error + Send + Sync + 'a>

fn from(err: String) -> Box<dyn Error + Send + Sync + 'a>

Converts a String into a box of dyn Error + Send + Sync.

Examples

use std::error::Error;

let a_string_error = "a string error".to_string();
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_string_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))

impl<'a> FromIterator<&'a char> for Box<str>

fn from_iter<I: IntoIterator<Item = &'a char>>(iter: I) -> Self

impl<'a> FromIterator<&'a str> for Box<str>

fn from_iter<I: IntoIterator<Item = &'a str>>(iter: I) -> Self

impl<'a> FromIterator<Cow<'a, str>> for Box<str>

fn from_iter<I: IntoIterator<Item = Cow<'a, str>>>(iter: I) -> Self

impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + 'a>

fn from(err: Cow<'b, str>) -> Box<dyn Error + 'a>

Converts a Cow into a box of dyn Error.

Examples

use std::error::Error;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error>::from(a_cow_str_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))

impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + Send + Sync + 'a>

fn from(err: Cow<'b, str>) -> Box<dyn Error + Send + Sync + 'a>

Converts a Cow into a box of dyn Error + Send + Sync.

Examples

use std::error::Error;
use std::borrow::Cow;

let a_cow_str_error = Cow::from("a str error");
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(a_cow_str_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))

impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a>

fn from(err: E) -> Box<dyn Error + 'a>

Converts a type of Error into a box of dyn Error.

Examples

use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "An error")
    }
}

impl Error for AnError {}

let an_error = AnError;
assert!(0 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error>::from(an_error);
assert!(size_of::<Box<dyn Error>>() == size_of_val(&a_boxed_error))

impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync + 'a>

fn from(err: E) -> Box<dyn Error + Send + Sync + 'a>

Converts a type of Error + Send + Sync into a box of dyn Error + Send + Sync.

Examples

use std::error::Error;
use std::fmt;

#[derive(Debug)]
struct AnError;

impl fmt::Display for AnError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "An error")
    }
}

impl Error for AnError {}

unsafe impl Send for AnError {}

unsafe impl Sync for AnError {}

let an_error = AnError;
assert!(0 == size_of_val(&an_error));
let a_boxed_error = Box::<dyn Error + Send + Sync>::from(an_error);
assert!(
    size_of::<Box<dyn Error + Send + Sync>>() == size_of_val(&a_boxed_error))

impl<A> WriteThroughCursor for Box<[u8], A> where A: Allocator,

fn write(this: &mut Cursor<Self>, buf: &[u8]) -> Result<usize>
fn write_vectored(this: &mut Cursor<Self>, bufs: &[IoSlice<'_>]) -> Result<usize>
fn is_write_vectored(_this: &Cursor<Self>) -> bool
fn write_all(this: &mut Cursor<Self>, buf: &[u8]) -> Result<()>
fn write_all_vectored(this: &mut Cursor<Self>, bufs: &mut [IoSlice<'_>]) -> Result<()>
fn flush(_this: &mut Cursor<Self>) -> Result<()>

impl<A: Allocator + Clone> Clone for Box<ByteStr, A>

fn clone(&self) -> Self

impl<A: Allocator + Clone> Clone for Box<CStr, A>

fn clone(&self) -> Self

impl<A: Allocator + Clone> Clone for Box<str, A>

fn clone(&self) -> Self

impl<A: Allocator> From<Box<str, A>> for Box<[u8], A>

fn from(s: Box<str, A>) -> Self

Converts a Box<str> into a Box<[u8]>

This conversion does not allocate on the heap and happens in place.

Examples

// create a Box<str> which will be used to create a Box<[u8]>
let boxed: Box<str> = Box::from("hello");
let boxed_str: Box<[u8]> = Box::from(boxed);

// create a &[u8] which will be used to create a Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice = Box::from(slice);

assert_eq!(boxed_slice, boxed_str);

impl<A: Allocator> FromIterator<Box<str, A>> for Box<str>

fn from_iter<I: IntoIterator<Item = Box<str, A>>>(iter: I) -> Self

impl<Args: Tuple, F: AsyncFn<Args> + ?Sized, A: Allocator> AsyncFn<Args> for Box<F, A>

extern ""rust-call"" fn async_call(&self, args: Args) -> Self::CallRefFuture<'_>

impl<Args: Tuple, F: AsyncFnMut<Args> + ?Sized, A: Allocator> AsyncFnMut<Args> for Box<F, A>

type CallRefFuture<'a> = <F as AsyncFnMut<Args>>::CallRefFuture<'a>;
extern ""rust-call"" fn async_call_mut(&mut self, args: Args) -> Self::CallRefFuture<'_>

impl<Args: Tuple, F: AsyncFnOnce<Args> + ?Sized, A: Allocator> AsyncFnOnce<Args> for Box<F, A>

type Output = <F as AsyncFnOnce<Args>>::Output;
type CallOnceFuture = <F as AsyncFnOnce<Args>>::CallOnceFuture;
extern ""rust-call"" fn async_call_once(self, args: Args) -> Self::CallOnceFuture

impl<Args: Tuple, F: Fn<Args> + ?Sized, A: Allocator> Fn<Args> for Box<F, A>

extern ""rust-call"" fn call(&self, args: Args) -> Self::Output

impl<Args: Tuple, F: FnMut<Args> + ?Sized, A: Allocator> FnMut<Args> for Box<F, A>

extern ""rust-call"" fn call_mut(&mut self, args: Args) -> Self::Output

impl<Args: Tuple, F: FnOnce<Args> + ?Sized, A: Allocator> FnOnce<Args> for Box<F, A>

type Output = <F as FnOnce<Args>>::Output;
extern ""rust-call"" fn call_once(self, args: Args) -> Self::Output

impl<B: BufRead + ?Sized, A: Allocator> BufRead for Box<B, A>

fn fill_buf(&mut self) -> Result<&[u8]>
fn consume(&mut self, amt: usize)
fn has_data_left(&mut self) -> Result<bool>
fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize>
fn skip_until(&mut self, byte: u8) -> Result<usize>
fn read_line(&mut self, buf: &mut String) -> Result<usize>

impl<E: Error, A: Allocator> Error for Box<E, A>

fn cause(&self) -> Option<&dyn Error>
fn source(&self) -> Option<&dyn Error + 'static>
fn provide<'b>(&'b self, request: &mut Request<'b>)

impl<F: ?Sized + Future + Unpin, A: Allocator> Future for Box<F, A>

type Output = <F as Future>::Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>

impl<G: ?Sized + Coroutine<R> + Unpin, R, A: Allocator> Coroutine<R> for Box<G, A>

type Yield = <G as Coroutine<R>>::Yield;
type Return = <G as Coroutine<R>>::Return;
fn resume(self: Pin<&mut Self>, arg: R) -> CoroutineState<Self::Yield, Self::Return>

impl<I, const N: usize, A: Allocator> !Iterator for Box<[I; N], A>

impl<I: DoubleEndedIterator + ?Sized, A: Allocator> DoubleEndedIterator for Box<I, A>

fn next_back(&mut self) -> Option<I::Item>
fn nth_back(&mut self, n: usize) -> Option<I::Item>

impl<I: ExactSizeIterator + ?Sized, A: Allocator> ExactSizeIterator for Box<I, A>

fn len(&self) -> usize
fn is_empty(&self) -> bool

impl<I: FusedIterator + ?Sized, A: Allocator> FusedIterator for Box<I, A>

impl<I: Iterator + ?Sized, A: Allocator> BoxIter for Box<I, A>

type Item = <I as Iterator>::Item;
fn last(self) -> Option<I::Item>

impl<I: Iterator + ?Sized, A: Allocator> Iterator for Box<I, A>

type Item = <I as Iterator>::Item;
fn next(&mut self) -> Option<I::Item>
fn size_hint(&self) -> (usize, Option<usize>)
fn nth(&mut self, n: usize) -> Option<I::Item>
fn last(self) -> Option<I::Item>

impl<I: Iterator, A: Allocator> BoxIter for Box<I, A>

fn last(self) -> Option<I::Item>

impl<R: Read + ?Sized, A: Allocator> Read for Box<R, A>

fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read_buf(&mut self, cursor: BorrowedCursor<'_, u8>) -> Result<()>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
fn is_read_vectored(&self) -> bool
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<()>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_, u8>) -> Result<()>

impl<R: Rng + ?Sized, A: Allocator> Rng for Box<R, A>

fn fill_bytes(&mut self, bytes: &mut [u8])

impl<S: ?Sized + AsyncIterator + Unpin> AsyncIterator for Box<S>

type Item = <S as AsyncIterator>::Item;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>>
fn size_hint(&self) -> (usize, Option<usize>)

impl<S: Seek + ?Sized, A: Allocator> Seek for Box<S, A>

fn seek(&mut self, pos: SeekFrom) -> Result<u64>
fn rewind(&mut self) -> Result<()>
fn stream_len(&mut self) -> Result<u64>
fn stream_position(&mut self) -> Result<u64>
fn seek_relative(&mut self, offset: i64) -> Result<()>

impl<T> Default for Box<[T]>

fn default() -> Self

Creates an empty [T] inside a Box.

impl<T> From<T> for Box<T>

fn from(t: T) -> Self

Converts a T into a Box<T>

The conversion allocates on the heap and moves t from the stack into it.

Examples

let x = 5;
let boxed = Box::new(5);

assert_eq!(Box::from(x), boxed);

impl<T> FromIterator<T> for Box<[T]>

fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self

impl<T> SizeHint for Box<T>

fn lower_bound(&self) -> usize
fn upper_bound(&self) -> Option<usize>

impl<T, A: Allocator> !Iterator for Box<[T], A>

impl<T, A: Allocator> From<Vec<T, A>> for Box<[T], A>

fn from(v: Vec<T, A>) -> Self

Converts a vector into a boxed slice.

Before doing the conversion, this method discards excess capacity like Vec::shrink_to_fit.

Examples

assert_eq!(Box::from(vec![1, 2, 3]), vec![1, 2, 3].into_boxed_slice());

Any excess capacity is removed:

let mut vec = Vec::with_capacity(10);
vec.extend([1, 2, 3]);

assert_eq!(Box::from(vec), vec![1, 2, 3].into_boxed_slice());

impl<T, A: Allocator> IntoIterator for Box<[T], A>

type IntoIter = IntoIter<T, A>;
type Item = T;
fn into_iter(self) -> IntoIter<T, A>

impl<T, const N: usize> From<[T; N]> for Box<[T]>

fn from(array: [T; N]) -> Box<[T]>

Converts a [T; N] into a Box<[T]>

This conversion moves the array to newly heap-allocated memory.

Examples

let boxed: Box<[u8]> = Box::from([4, 2]);
println!("{boxed:?}");

impl<T, const N: usize, A: Allocator> IntoIterator for Box<[T; N], A>

type IntoIter = BoxedArrayIntoIter<T, N, A>;
type Item = T;
fn into_iter(self) -> BoxedArrayIntoIter<T, N, A>

impl<T, const N: usize, A: Allocator> TryFrom<Box<[T], A>> for Box<[T; N], A>

type Error = Box<[T], A>;
fn try_from(boxed_slice: Box<[T], A>) -> Result<Self, Self::Error>

Attempts to convert a Box<[T]> into a Box<[T; N]>.

The conversion occurs in-place and does not require a new memory allocation.

Errors

Returns the old Box<[T]> in the Err variant if boxed_slice.len() does not equal N.

impl<T, const N: usize, A: Allocator> TryFrom<Vec<T, A>> for Box<[T; N], A>

type Error = Vec<T, A>;
fn try_from(vec: Vec<T, A>) -> Result<Self, Self::Error>

Attempts to convert a Vec<T> into a Box<[T; N]>.

Like Vec::into_boxed_slice, this is in-place if vec.capacity() == N, but will require a reallocation otherwise.

Errors

Returns the original Vec<T> in the Err variant if boxed_slice.len() does not equal N.

Examples

This can be used with [vec!] to create an array on the heap:

let state: Box<[f32; 100]> = vec![1.0; 100].try_into().unwrap();
assert_eq!(state.len(), 100);

impl<T: ?Sized + Allocator, A: Allocator> Allocator for Box<T, A>

fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout)
unsafe fn grow(&self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow_zeroed(&self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout) -> Result<NonNull<[u8]>, AllocError>
unsafe fn shrink(&self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout) -> Result<NonNull<[u8]>, AllocError>

impl<T: ?Sized + Allocator, A: Allocator> AllocatorNightly for Box<T, A>

impl<T: ?Sized + Eq, A: Allocator> Eq for Box<T, A>

impl<T: ?Sized + Hash, A: Allocator> Hash for Box<T, A>

fn hash<H: Hasher>(&self, state: &mut H)

impl<T: ?Sized + Hasher, A: Allocator> Hasher for Box<T, A>

fn finish(&self) -> u64
fn write(&mut self, bytes: &[u8])
fn write_u8(&mut self, i: u8)
fn write_u16(&mut self, i: u16)
fn write_u32(&mut self, i: u32)
fn write_u64(&mut self, i: u64)
fn write_u128(&mut self, i: u128)
fn write_usize(&mut self, i: usize)
fn write_i8(&mut self, i: i8)
fn write_i16(&mut self, i: i16)
fn write_i32(&mut self, i: i32)
fn write_i64(&mut self, i: i64)
fn write_i128(&mut self, i: i128)
fn write_isize(&mut self, i: isize)
fn write_length_prefix(&mut self, len: usize)
fn write_str(&mut self, s: &str)

impl<T: ?Sized + Ord, A: Allocator> Ord for Box<T, A>

fn cmp(&self, other: &Self) -> Ordering

impl<T: ?Sized + PartialEq, A: Allocator> PartialEq for Box<T, A>

fn eq(&self, other: &Self) -> bool
fn ne(&self, other: &Self) -> bool

impl<T: ?Sized + PartialOrd, A: Allocator> PartialOrd for Box<T, A>

fn partial_cmp(&self, other: &Self) -> Option<Ordering>
fn lt(&self, other: &Self) -> bool
fn le(&self, other: &Self) -> bool
fn ge(&self, other: &Self) -> bool
fn gt(&self, other: &Self) -> bool

impl<T: ?Sized + Unsize<U>, U: ?Sized> DispatchFromDyn<Box<U>> for Box<T, Global>

impl<T: ?Sized + Unsize<U>, U: ?Sized, A: Allocator> CoerceUnsized<Box<U, A>> for Box<T, A>

impl<T: ?Sized, A: Allocator> AsMut<T> for Box<T, A>

fn as_mut(&mut self) -> &mut T

impl<T: ?Sized, A: Allocator> AsRef<T> for Box<T, A>

fn as_ref(&self) -> &T

impl<T: ?Sized, A: Allocator> Borrow<T> for Box<T, A>

fn borrow(&self) -> &T

impl<T: ?Sized, A: Allocator> BorrowMut<T> for Box<T, A>

fn borrow_mut(&mut self) -> &mut T

impl<T: ?Sized, A: Allocator> Deref for Box<T, A>

type Target = T;
fn deref(&self) -> &T

impl<T: ?Sized, A: Allocator> DerefMut for Box<T, A>

fn deref_mut(&mut self) -> &mut T

impl<T: ?Sized, A: Allocator> DerefPure for Box<T, A>

impl<T: ?Sized, A: Allocator> Drop for Box<T, A>

fn drop(&mut self)

impl<T: ?Sized, A: Allocator> LegacyReceiver for Box<T, A>

impl<T: ?Sized, A: Allocator> Pointer for Box<T, A>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl<T: ?Sized, A: Allocator> Unpin for Box<T, A>

impl<T: ?Sized, A: StaticAllocator> PinSafePointer for Box<T, A>

impl<T: Clone> From<&[T]> for Box<[T]>

fn from(slice: &[T]) -> Box<[T]>

Converts a &[T] into a Box<[T]>

This conversion allocates on the heap and performs a copy of slice and its contents.

Examples

// create a &[u8] which will be used to create a Box<[u8]>
let slice: &[u8] = &[104, 101, 108, 108, 111];
let boxed_slice: Box<[u8]> = Box::from(slice);

println!("{boxed_slice:?}");

impl<T: Clone> From<&mut [T]> for Box<[T]>

fn from(slice: &mut [T]) -> Box<[T]>

Converts a &mut [T] into a Box<[T]>

This conversion allocates on the heap and performs a copy of slice and its contents.

Examples

// create a &mut [u8] which will be used to create a Box<[u8]>
let mut array = [104, 101, 108, 108, 111];
let slice: &mut [u8] = &mut array;
let boxed_slice: Box<[u8]> = Box::from(slice);

println!("{boxed_slice:?}");

impl<T: Clone> From<Cow<'_, [T]>> for Box<[T]>

fn from(cow: Cow<'_, [T]>) -> Box<[T]>

Converts a Cow<'_, [T]> into a Box<[T]>

When cow is the Cow::Borrowed variant, this conversion allocates on the heap and copies the underlying slice. Otherwise, it will try to reuse the owned Vec's allocation.

impl<T: Clone, A: Allocator + Clone> Clone for Box<T, A>

fn clone(&self) -> Self

Returns a new box with a clone() of this box's contents.

Examples

let x = Box::new(5);
let y = x.clone();

// The value is the same
assert_eq!(x, y);

// But they are unique objects
assert_ne!(&*x as *const i32, &*y as *const i32);
fn clone_from(&mut self, source: &Self)

Copies source's contents into self without creating a new allocation.

Examples

let x = Box::new(5);
let mut y = Box::new(10);
let yp: *const i32 = &*y;

y.clone_from(&x);

// The value is the same
assert_eq!(x, y);

// And no allocation occurred
assert_eq!(yp, &*y);

impl<T: Clone, A: Allocator + Clone> Clone for Box<[T], A>

fn clone(&self) -> Self
fn clone_from(&mut self, source: &Self)

Copies source's contents into self without creating a new allocation, so long as the two are of the same length.

Examples

let x = Box::new([5, 6, 7]);
let mut y = Box::new([8, 9, 10]);
let yp: *const [i32] = &*y;

y.clone_from(&x);

// The value is the same
assert_eq!(x, y);

// And no allocation occurred
assert_eq!(yp, &*y);

impl<T: Debug + ?Sized, A: Allocator> Debug for Box<T, A>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl<T: Default> Default for Box<T>

fn default() -> Self

Creates a Box<T>, with the Default value for T.

impl<T: Display + ?Sized, A: Allocator> Display for Box<T, A>

fn fmt(&self, f: &mut Formatter<'_>) -> Result

impl<W: Write + ?Sized, A: Allocator> Write for Box<W, A>

fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize>
fn is_write_vectored(&self) -> bool
fn flush(&mut self) -> Result<()>
fn write_all(&mut self, buf: &[u8]) -> Result<()>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()>
fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()>

Auto Trait Implementations

impl<T, A> Freeze for Box<T, A> where Unique<T>: Freeze, A: Freeze, T: ?Sized,

impl<T, A> RefUnwindSafe for Box<T, A> where Unique<T>: RefUnwindSafe, A: RefUnwindSafe, T: ?Sized,

impl<T, A> Send for Box<T, A> where Unique<T>: Send, A: Send, T: ?Sized,

impl<T, A> Sync for Box<T, A> where Unique<T>: Sync, A: Sync, T: ?Sized,

impl<T, A> UnsafeUnpin for Box<T, A> where Unique<T>: UnsafeUnpin, A: UnsafeUnpin, T: ?Sized,

impl<T, A> UnwindSafe for Box<T, A> where Unique<T>: UnwindSafe, A: UnwindSafe, T: ?Sized,

Blanket Implementations

impl<F> IntoFuture for Box<T, A> where F: Future,

type Output = <F as Future>::Output;
type IntoFuture = F;
fn into_future(self) -> <F as IntoFuture>::IntoFuture

impl<F> Pattern for Box<T, A> where F: FnMut(char) -> bool,

type Searcher<'a> = CharPredicateSearcher<'a, F>;
fn into_searcher<'a>(self, haystack: &'a str) -> CharPredicateSearcher<'a, F>
fn is_contained_in<'a>(self, haystack: &'a str) -> bool
fn is_prefix_of<'a>(self, haystack: &'a str) -> bool
fn strip_prefix_of<'a>(self, haystack: &'a str) -> Option<&'a str>
fn is_suffix_of<'a>(self, haystack: &'a str) -> bool
where
    CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,
fn strip_suffix_of<'a>(self, haystack: &'a str) -> Option<&'a str>
where
    CharPredicateSearcher<'a, F>: ReverseSearcher<'a>,

impl<I> IntoAsyncIterator for Box<T, A> where I: AsyncIterator,

type Item = <I as AsyncIterator>::Item;
type IntoAsyncIter = I;
fn into_async_iter(self) -> <I as IntoAsyncIterator>::IntoAsyncIter

impl<I> IntoIterator for Box<T, A> where I: Iterator,

type Item = <I as Iterator>::Item;
type IntoIter = I;
fn into_iter(self) -> I

impl<P, T> Receiver for Box<T, A> where P: Deref<Target = T> + ?Sized, T: ?Sized,

type Target = T;

impl<R> SpecReadByte for Box<T, A> where R: Read,

fn spec_read_byte(&mut self) -> Option<Result<u8>>

impl<T> Any for Box<T, A> where T: 'static + ?Sized,

fn type_id(&self) -> TypeId

impl<T> Borrow<T> for Box<T, A> where T: ?Sized,

fn borrow(&self) -> &T

impl<T> BorrowMut<T> for Box<T, A> where T: ?Sized,

fn borrow_mut(&mut self) -> &mut T

impl<T> CloneToUninit for Box<T, A> where T: Clone,

unsafe fn clone_to_uninit(&self, dest: *mut u8)

impl<T> From<T> for Box<T, A>

fn from(t: T) -> T

Returns the argument unchanged.

impl<T> SizeHint for Box<T, A> where T: ?Sized,

fn lower_bound(&self) -> usize
fn upper_bound(&self) -> Option<usize>

impl<T> SizedTypeProperties for Box<T, A>

impl<T> ToOwned for Box<T, A> where T: Clone,

type Owned = T;
fn to_owned(&self) -> T
fn clone_into(&self, target: &mut T)

impl<T> ToString for Box<T, A> where T: Display + ?Sized,

fn to_string(&self) -> String

impl<T, U> Into<U> for Box<T, A> where U: From<T>,

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

impl<T, U> TryFrom<U> for Box<T, A> where U: Into<T>,

type Error = never;
fn try_from(value: U) -> Result<T, never>

impl<T, U> TryInto<U> for Box<T, A> where U: TryFrom<T>,

type Error = <U as TryFrom<T>>::Error;
fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>