cactusref 0.5.0

Cycle-aware reference counting smart pointer
Documentation
#![warn(clippy::all)]
#![warn(clippy::pedantic)]

use cactusref::Rc;
use core::cell::RefCell;

struct RString {
    inner: String,
    link: Option<Rc<RefCell<Self>>>,
}

#[test]
fn leak_chain() {
    env_logger::Builder::from_env("CACTUS_LOG").init();

    log::info!("chain");

    let s = "a".repeat(1024 * 1024);

    let first = Rc::new(RefCell::new(RString {
        inner: s.clone(),
        link: None,
    }));
    let mut last = Rc::clone(&first);
    for _ in 1..10 {
        let obj = Rc::new(RefCell::new(RString {
            inner: s.clone(),
            link: Some(Rc::clone(&last)),
        }));
        last = obj;
    }
    assert!(first.borrow().link.is_none());
    assert_eq!(first.borrow().inner, s);
    assert!(last.borrow().link.is_some());
    assert_eq!(last.borrow().inner, s);
    drop(first);
    drop(last);
}