Struct Box

struct Box<T: ?Sized, A: Allocator = crate::alloc::Global>(_, _)

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

See the module-level documentation for more.

Implementations

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

fn downcast<T: Any>(self: 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: 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> crate::boxed::Box<dyn Any + Send, A>

fn downcast<T: Any>(self: 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: 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> crate::boxed::Box<dyn Any, A>

fn downcast<T: Any>(self: 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: 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);
fn new_uninit() -> Box<mem::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<mem::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_api)]

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

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

Examples

#![feature(allocator_api)]

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<mem::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_api)]

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

assert_eq!(*zero, 0);
# Ok::<(), std::alloc::AllocError>(())
fn map<U, impl FnOnce(T) -> U: FnOnce(T) -> U>(this: Self, f: impl FnOnce(T) -> U) -> Box<U>

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

#![feature(smart_pointer_try_map)]

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

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> Box<[T]>

fn new_uninit_slice(len: usize) -> Box<[mem::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<[mem::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<[mem::MaybeUninit<T>]>, AllocError>

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

Examples

#![feature(allocator_api)]

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<[mem::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_api)]

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>(())
fn into_array<N: usize>(self: Self) -> Option<Box<[T; N]>>

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.

If N is not exactly equal to the length of self, then this method returns None.

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

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

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

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

Examples

#![feature(allocator_api)]

use std::alloc::System;

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

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_api)]

use std::alloc::System;

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

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

Examples

#![feature(allocator_api)]

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<mem::MaybeUninit<T>, A>, AllocError>
where
    A: Allocator

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

Examples

#![feature(allocator_api)]

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<mem::MaybeUninit<T>, A>
where
    A: Allocator

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_api)]

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<mem::MaybeUninit<T>, A>, AllocError>
where
    A: Allocator

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_api)]

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: 'static + Allocator

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.

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<mem::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

#![feature(box_take)]

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);

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

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

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

Examples

#![feature(allocator_api)]

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<[mem::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_api)]

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<[mem::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_api)]

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<[mem::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_api)]

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>(())

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

unsafe fn assume_init(self: 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<mem::MaybeUninit<T>, A>

unsafe fn assume_init(self: 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: ?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)]
#![feature(allocator_api)]

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)]
#![feature(allocator_api)]

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)]
#![feature(allocator_api)]

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.

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.

Examples

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

#![feature(box_vec_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:

#![feature(box_vec_non_null)]

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

unsafe {
    let non_null = NonNull::new(alloc(Layout::new::<i32>()).cast::<i32>())
        .expect("allocation failed");
    // 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:

#![feature(box_vec_non_null)]

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:

#![feature(box_vec_non_null)]

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:

#![feature(box_vec_non_null)]

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.

Examples

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

#![feature(allocator_api)]

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(allocator_api, 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.

Examples

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

#![feature(allocator_api, box_vec_non_null)]

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:

#![feature(allocator_api, box_vec_non_null, slice_ptr_get)]

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>(())
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:

#![feature(allocator_api)]

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:

#![feature(allocator_api)]

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:

#![feature(allocator_api, box_vec_non_null)]

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:

#![feature(allocator_api, box_vec_non_null)]

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 and as_mut_ptr. 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_ptr)]

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 and as_mut_ptr. 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:

#![feature(box_as_ptr)]

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 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. Dropping the returned reference will cause a memory leak. If this is not acceptable, the reference should first be wrapped with the Box::from_raw function producing a Box. This Box can then be dropped which will properly destroy T and release the allocated memory.

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: 'static

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);

impl Clone for Box<str>

fn clone(self: &Self) -> Self

impl Clone for crate::boxed::Box<ByteStr>

fn clone(self: &Self) -> Self

impl Clone for crate::boxed::Box<core::ffi::CStr>

fn clone(self: &Self) -> Self

impl Default for Box<str>

fn default() -> Self

impl Default for crate::boxed::Box<core::ffi::CStr>

fn default() -> Box<CStr>

impl From for crate::boxed::Box<ByteStr>

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

impl From for crate::boxed::Box<core::ffi::CStr>

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

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

impl From for crate::boxed::Box<core::ffi::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 for crate::boxed::Box<core::ffi::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 for crate::boxed::Box<core::ffi::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 for crate::boxed::Box<[u8]>

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

impl From for crate::boxed::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 for crate::boxed::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 for crate::boxed::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 for crate::boxed::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 for crate::boxed::Box<str>

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

impl FromIterator for crate::boxed::Box<str>

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

impl<'a> From for crate::boxed::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 for crate::boxed::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 for crate::boxed::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> From for crate::boxed::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> FromIterator for crate::boxed::Box<str>

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

impl<'a> FromIterator for crate::boxed::Box<str>

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

impl<'a> FromIterator for crate::boxed::Box<str>

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

impl<'a, 'b> From for crate::boxed::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 for crate::boxed::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 for crate::boxed::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 for crate::boxed::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: Allocator> From for crate::boxed::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 for crate::boxed::Box<str>

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

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

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

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

extern Other("\"rust-call\"") fn async_call_mut(self: &mut Self, args: Args) -> <Self as >::CallRefFuture<'_>

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

extern Other("\"rust-call\"") fn async_call_once(self: Self, args: Args) -> <Self as >::CallOnceFuture

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

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

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

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

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

extern Other("\"rust-call\"") fn call_once(self: Self, args: Args) -> <Self as >::Output

impl<E: Error> Error for Box<E>

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

impl<F> IntoFuture for Box<T, A>

fn into_future(self: Self) -> <F as IntoFuture>::IntoFuture

impl<F> Pattern for Box<T, A>

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

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

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

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

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

impl<I> FromIterator for crate::boxed::Box<[I]>

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

impl<I> IntoAsyncIterator for Box<T, A>

fn into_async_iter(self: Self) -> <I as IntoAsyncIterator>::IntoAsyncIter

impl<I> IntoIterator for Box<T, A>

fn into_iter(self: Self) -> I

impl<I, A: Allocator> IntoIterator for crate::boxed::Box<[I], A>

fn into_iter(self: Self) -> vec::IntoIter<I, A>

impl<I, A: Allocator> Iterator for crate::boxed::Box<[I], A>

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

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

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

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

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

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

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

impl<P, T> Receiver for Box<T, A>

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

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

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

fn type_id(self: &Self) -> TypeId

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

fn borrow(self: &Self) -> &T

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

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

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

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

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

fn default() -> Self

Creates an empty [T] inside a Box.

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

fn from(t: T) -> T

Returns the argument unchanged.

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

fn from(t: never) -> T

impl<T> From for crate::boxed::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> ToOwned for Box<T, A>

fn to_owned(self: &Self) -> T
fn clone_into(self: &Self, target: &mut T)

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

fn to_string(self: &Self) -> String

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

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

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

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

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

impl<T, A: Allocator> From for crate::boxed::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, N: usize> From for crate::boxed::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, N: usize> TryFrom for crate::boxed::Box<[T; N]>

fn try_from(boxed_slice: Box<[T]>) -> Result<Self, <Self as >::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, N: usize> TryFrom for crate::boxed::Box<[T; N]>

fn try_from(vec: Vec<T>) -> Result<Self, <Self as >::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, U> Into for Box<T, A>

fn into(self: 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 for Box<T, A>

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

impl<T, U> TryInto for Box<T, A>

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

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

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

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: &Self, state: &mut H)

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

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

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

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

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

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

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

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

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

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

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

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

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

fn as_ref(self: &Self) -> &T

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

fn borrow(self: &Self) -> &T

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

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

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

fn deref(self: &Self) -> &T

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

fn deref_mut(self: &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(self: &mut Self)

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

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

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

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

impl<T: Clone> From for crate::boxed::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 for crate::boxed::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> From for crate::boxed::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, A: Allocator + Clone> Clone for Box<T, A>

fn clone(self: &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(self: &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) -> Self
fn clone_from(self: &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: Default> Default for Box<T>

fn default() -> Self

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

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

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

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

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