From 5d9ed0bc0e7922fb1fbdc518edc9bacb342fad6e Mon Sep 17 00:00:00 2001 From: Gleb Kozyrev Date: Thu, 12 Mar 2015 17:09:26 +0200 Subject: [PATCH] Update the ways to get a pointer from a box Show how to get a pointer without destroying the box. Use `boxed::into_raw` instead of `mem::transmute`. --- src/libcore/ptr.rs | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index 0625c3c7d6018..32123a8271ce4 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -33,31 +33,34 @@ //! let my_speed_ptr: *mut i32 = &mut my_speed; //! ``` //! +//! To get a pointer to a boxed value, dereference the box: +//! +//! ``` +//! let my_num: Box = Box::new(10); +//! let my_num_ptr: *const i32 = &*my_num; +//! let mut my_speed: Box = Box::new(88); +//! let my_speed_ptr: *mut i32 = &mut *my_speed; +//! ``` +//! //! This does not take ownership of the original allocation //! and requires no resource management later, //! but you must not use the pointer after its lifetime. //! -//! ## 2. Transmute an owned box (`Box`). +//! ## 2. Consume a box (`Box`). //! -//! The `transmute` function takes, by value, whatever it's given -//! and returns it as whatever type is requested, as long as the -//! types are the same size. Because `Box` and `*mut T` have the same -//! representation they can be trivially, -//! though unsafely, transformed from one type to the other. +//! The `into_raw` function consumes a box and returns +//! the raw pointer. It doesn't destroy `T` or deallocate any memory. //! //! ``` -//! use std::mem; +//! use std::boxed; //! //! unsafe { -//! let my_num: Box = Box::new(10); -//! let my_num: *const i32 = mem::transmute(my_num); //! let my_speed: Box = Box::new(88); -//! let my_speed: *mut i32 = mem::transmute(my_speed); +//! let my_speed: *mut i32 = boxed::into_raw(my_speed); //! //! // By taking ownership of the original `Box` though -//! // we are obligated to transmute it back later to be destroyed. -//! drop(mem::transmute::<_, Box>(my_speed)); -//! drop(mem::transmute::<_, Box>(my_num)); +//! // we are obligated to put it together later to be destroyed. +//! drop(Box::from_raw(my_speed)); //! } //! ``` //!