pub struct RcWeak<T, A = Global>{ /* private fields */ }alloc only.Expand description
๐ซ ๐
alloc
A version of Rc that holds a non-owning ref to the managed allocation.
๐sys::mem re-exported from alloc::rc ::Weak as RcWeak
๐
Weak is a version of Rc that holds a non-owning reference to the
managed allocation.
The allocation is accessed by calling upgrade on the Weak
pointer, which returns an Option<Rc<T>>.
Since a Weak reference does not count towards ownership, it will not
prevent the value stored in the allocation from being dropped, and Weak itself makes no
guarantees about the value still being present. Thus it may return None
when upgraded. Note however that a Weak reference does prevent the allocation
itself (the backing store) from being deallocated.
A Weak pointer is useful for keeping a temporary reference to the allocation
managed by Rc without preventing its inner value from being dropped. It is also used to
prevent circular references between Rc pointers, since mutual owning references
would never allow either Rc to be dropped. For example, a tree could
have strong Rc pointers from parent nodes to children, and Weak
pointers from children back to their parents.
The typical way to obtain a Weak pointer is to call Rc::downgrade.
Implementationsยง
Sourceยงimpl<T, A> Weak<T, A>where
A: Allocator,
impl<T, A> Weak<T, A>where
A: Allocator,
Sourceยงimpl<T> Weak<T>where
T: ?Sized,
impl<T> Weak<T>where
T: ?Sized,
1.45.0 ยท Sourcepub unsafe fn from_raw(ptr: *const T) -> Weak<T>
pub unsafe fn from_raw(ptr: *const T) -> Weak<T>
Converts a raw pointer previously created by into_raw back into Weak<T>.
This can be used to safely get a strong reference (by calling upgrade
later) or to deallocate the weak count by dropping the Weak<T>.
It takes ownership of one weak reference (with the exception of pointers created by new,
as these donโt own anything; the method still works on them).
ยงSafety
The pointer must have originated from the into_raw and must still own its potential
weak reference, and ptr must point to a block of memory allocated by the global allocator.
It is allowed for the strong count to be 0 at the time of calling this. Nevertheless, this
takes ownership of one weak reference currently represented as a raw pointer (the weak
count is not modified by this operation) and therefore it must be paired with a previous
call to into_raw.
ยงExamples
use std::rc::{Rc, Weak};
let strong = Rc::new("hello".to_owned());
let raw_1 = Rc::downgrade(&strong).into_raw();
let raw_2 = Rc::downgrade(&strong).into_raw();
assert_eq!(2, Rc::weak_count(&strong));
assert_eq!("hello", &*unsafe { Weak::from_raw(raw_1) }.upgrade().unwrap());
assert_eq!(1, Rc::weak_count(&strong));
drop(strong);
// Decrement the last weak count.
assert!(unsafe { Weak::from_raw(raw_2) }.upgrade().is_none());1.45.0 ยท Sourcepub fn into_raw(self) -> *const T
pub fn into_raw(self) -> *const T
Consumes the Weak<T> and turns it into a raw pointer.
This converts the weak pointer into a raw pointer, while still preserving the ownership of
one weak reference (the weak count is not modified by this operation). It can be turned
back into the Weak<T> with from_raw.
The same restrictions of accessing the target of the pointer as with
as_ptr apply.
ยงExamples
use std::rc::{Rc, Weak};
let strong = Rc::new("hello".to_owned());
let weak = Rc::downgrade(&strong);
let raw = weak.into_raw();
assert_eq!(1, Rc::weak_count(&strong));
assert_eq!("hello", unsafe { &*raw });
drop(unsafe { Weak::from_raw(raw) });
assert_eq!(0, Rc::weak_count(&strong));Sourceยงimpl<T, A> Weak<T, A>
impl<T, A> Weak<T, A>
Sourcepub fn allocator(&self) -> &A
๐ฌThis is a nightly-only experimental API. (allocator_api)
pub fn allocator(&self) -> &A
allocator_api)Returns a reference to the underlying allocator.
1.45.0 ยท Sourcepub fn as_ptr(&self) -> *const T
pub fn as_ptr(&self) -> *const T
Returns a raw pointer to the object T pointed to by this Weak<T>.
The pointer is valid only if there are some strong references. The pointer may be dangling,
unaligned or even null otherwise.
ยงExamples
use std::rc::Rc;
use std::ptr;
let strong = Rc::new("hello".to_owned());
let weak = Rc::downgrade(&strong);
// Both point to the same object
assert!(ptr::eq(&*strong, weak.as_ptr()));
// The strong here keeps it alive, so we can still access the object.
assert_eq!("hello", unsafe { &*weak.as_ptr() });
drop(strong);
// But not any more. We can do weak.as_ptr(), but accessing the pointer would lead to
// undefined behavior.
// assert_eq!("hello", unsafe { &*weak.as_ptr() });Sourcepub fn into_raw_with_allocator(self) -> (*const T, A) โ
๐ฌThis is a nightly-only experimental API. (allocator_api)
pub fn into_raw_with_allocator(self) -> (*const T, A) โ
allocator_api)Consumes the Weak<T>, returning the wrapped pointer and allocator.
This converts the weak pointer into a raw pointer, while still preserving the ownership of
one weak reference (the weak count is not modified by this operation). It can be turned
back into the Weak<T> with from_raw_in.
The same restrictions of accessing the target of the pointer as with
as_ptr apply.
ยงExamples
#![feature(allocator_api)]
use std::rc::{Rc, Weak};
use std::alloc::System;
let strong = Rc::new_in("hello".to_owned(), System);
let weak = Rc::downgrade(&strong);
let (raw, alloc) = weak.into_raw_with_allocator();
assert_eq!(1, Rc::weak_count(&strong));
assert_eq!("hello", unsafe { &*raw });
drop(unsafe { Weak::from_raw_in(raw, alloc) });
assert_eq!(0, Rc::weak_count(&strong));Sourcepub unsafe fn from_raw_in(ptr: *const T, alloc: A) -> Weak<T, A>
๐ฌThis is a nightly-only experimental API. (allocator_api)
pub unsafe fn from_raw_in(ptr: *const T, alloc: A) -> Weak<T, A>
allocator_api)Converts a raw pointer previously created by into_raw back into Weak<T>.
This can be used to safely get a strong reference (by calling upgrade
later) or to deallocate the weak count by dropping the Weak<T>.
It takes ownership of one weak reference (with the exception of pointers created by new,
as these donโt own anything; the method still works on them).
ยงSafety
The pointer must have originated from the into_raw and must still own its potential
weak reference, and ptr must point to a block of memory allocated by alloc.
It is allowed for the strong count to be 0 at the time of calling this. Nevertheless, this
takes ownership of one weak reference currently represented as a raw pointer (the weak
count is not modified by this operation) and therefore it must be paired with a previous
call to into_raw.
ยงExamples
use std::rc::{Rc, Weak};
let strong = Rc::new("hello".to_owned());
let raw_1 = Rc::downgrade(&strong).into_raw();
let raw_2 = Rc::downgrade(&strong).into_raw();
assert_eq!(2, Rc::weak_count(&strong));
assert_eq!("hello", &*unsafe { Weak::from_raw(raw_1) }.upgrade().unwrap());
assert_eq!(1, Rc::weak_count(&strong));
drop(strong);
// Decrement the last weak count.
assert!(unsafe { Weak::from_raw(raw_2) }.upgrade().is_none());1.4.0 ยท Sourcepub fn upgrade(&self) -> Option<Rc<T, A>> โwhere
A: Clone,
pub fn upgrade(&self) -> Option<Rc<T, A>> โwhere
A: Clone,
Attempts to upgrade the Weak pointer to an Rc, delaying
dropping of the inner value if successful.
Returns None in the following cases:
-
The inner value has since been dropped or moved out.
-
This
Weakdoes not point to an allocation. -
The owning reference this
Weakis associated with is either not fully-constructed or does not allow an upgrade.
ยงExamples
use std::rc::Rc;
let five = Rc::new(5);
let weak_five = Rc::downgrade(&five);
let strong_five: Option<Rc<_>> = weak_five.upgrade();
assert!(strong_five.is_some());
// Destroy all strong pointers.
drop(strong_five);
drop(five);
assert!(weak_five.upgrade().is_none());1.41.0 ยท Sourcepub fn strong_count(&self) -> usize
pub fn strong_count(&self) -> usize
Gets the number of strong (Rc) pointers pointing to this allocation.
If self was created using Weak::new, this will return 0.
1.41.0 ยท Sourcepub fn weak_count(&self) -> usize
pub fn weak_count(&self) -> usize
Gets the number of Weak pointers pointing to this allocation.
If no strong pointers remain, this will return zero.
1.39.0 ยท Sourcepub fn ptr_eq(&self, other: &Weak<T, A>) -> bool
pub fn ptr_eq(&self, other: &Weak<T, A>) -> bool
Returns true if the two Weaks point to the same allocation similar to ptr::eq, or if
both donโt point to any allocation (because they were created with Weak::new()). However,
this function ignores the metadata of dyn Trait pointers.
ยงNotes
Since this compares pointers it means that Weak::new() will equal each
other, even though they donโt point to any allocation.
ยงExamples
use std::rc::Rc;
let first_rc = Rc::new(5);
let first = Rc::downgrade(&first_rc);
let second = Rc::downgrade(&first_rc);
assert!(first.ptr_eq(&second));
let third_rc = Rc::new(5);
let third = Rc::downgrade(&third_rc);
assert!(!first.ptr_eq(&third));Comparing Weak::new.
use std::rc::{Rc, Weak};
let first = Weak::new();
let second = Weak::new();
assert!(first.ptr_eq(&second));
let third_rc = Rc::new(());
let third = Rc::downgrade(&third_rc);
assert!(!first.ptr_eq(&third));Trait Implementationsยง
impl<T, A> !Send for Weak<T, A>
impl<T, A> !Sync for Weak<T, A>
1.4.0 ยท Sourceยงimpl<T, A> Clone for Weak<T, A>
impl<T, A> Clone for Weak<T, A>
Sourceยงfn clone(&self) -> Weak<T, A>
fn clone(&self) -> Weak<T, A>
Makes a clone of the Weak pointer that points to the same allocation.
ยงExamples
use std::rc::{Rc, Weak};
let weak_five = Rc::downgrade(&Rc::new(5));
let _ = Weak::clone(&weak_five);1.0.0 (const: unstable) ยท Sourceยงfn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<T> CloneFromCell for Weak<T>where
T: ?Sized,
impl<T, U, A> CoerceUnsized<Weak<U, A>> for Weak<T, A>
impl<T, U> DispatchFromDyn<Weak<U>> for Weak<T>
1.4.0 ยท Sourceยงimpl<T, A> Drop for Weak<T, A>
impl<T, A> Drop for Weak<T, A>
Sourceยงfn drop(&mut self)
fn drop(&mut self)
Drops the Weak pointer.
ยงExamples
use std::rc::{Rc, Weak};
struct Foo;
impl Drop for Foo {
fn drop(&mut self) {
println!("dropped!");
}
}
let foo = Rc::new(Foo);
let weak_foo = Rc::downgrade(&foo);
let other_weak_foo = Weak::clone(&weak_foo);
drop(weak_foo); // Doesn't print anything
drop(foo); // Prints "dropped!"
assert!(other_weak_foo.upgrade().is_none());impl<T, A> UseCloned for Weak<T, A>
Auto Trait Implementationsยง
impl<T, A = Global> !RefUnwindSafe for Weak<T, A>
impl<T, A = Global> !UnwindSafe for Weak<T, A>
impl<T, A> Freeze for Weak<T, A>
impl<T, A> Unpin for Weak<T, A>
impl<T, A> UnsafeUnpin for Weak<T, A>where
A: UnsafeUnpin,
T: ?Sized,
Blanket Implementationsยง
Sourceยงimpl<T> AnyExt for T
impl<T> AnyExt for T
Sourceยงfn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
TypeId of Self using a custom hasher.Sourceยงfn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Sourceยงfn as_any_box(self: Box<Self>) -> Box<dyn Any>where
Self: Sized,
fn as_any_box(self: Box<Self>) -> Box<dyn Any>where
Self: Sized,
alloc only.Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Sourceยงimpl<T> ByteSized for T
impl<T> ByteSized for T
Sourceยงconst BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Sourceยงfn byte_align(&self) -> usize
fn byte_align(&self) -> usize
Sourceยงfn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Sourceยงimpl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Sourceยงimpl<T> MemExt for Twhere
T: ?Sized,
impl<T> MemExt for Twhere
T: ?Sized,
Sourceยงconst NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Sourceยงfn mem_align_of<T>() -> usize
fn mem_align_of<T>() -> usize
Sourceยงfn mem_align_of_val(&self) -> usize
fn mem_align_of_val(&self) -> usize
Sourceยงfn mem_size_of<T>() -> usize
fn mem_size_of<T>() -> usize
Sourceยงfn mem_size_of_val(&self) -> usize
fn mem_size_of_val(&self) -> usize
Sourceยงfn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true if dropping values of this type matters. Read moreSourceยงfn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self without running its destructor. Read moreSourceยงfn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Sourceยงunsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงunsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงfn mem_as_bytes(&self) -> &[u8] โ
fn mem_as_bytes(&self) -> &[u8] โ
unsafe_slice only.